Python安装在本地目录中。
我的目录树如下所示:
(local directory)/site-packages/toolkit/interface.py
我的代码在这里:
(local directory)/site-packages/toolkit/examples/mountain.py
为了运行这个例子,我写了python mountain.py
,在我的代码中:
from toolkit.interface import interface
我收到错误:
Traceback (most recent call last):
File "mountain.py", line 28, in ?
from toolkit.interface import interface
ImportError: No module named toolkit.interface
我已经检查了sys.path
,我在那里有/site-packages
目录。另外,我在toolkit文件夹中有文件__init__.py.bin
,向Python表明这是一个包。我在examples目录中也有一个__init__.py.bin
。
我不知道为什么Python在sys.path
中找不到该文件。有任何想法吗?可以是权限问题吗?我需要一些执行权限吗?
根据您对orip帖子的评论,我想这就是发生的事情:
__init__.py
。__init__.py
(现在称为__init__.py.bin
)意味着python不能将工具包理解为一个包。__init__.py
,一切正常......?例如:/ etc / environment
PYTHONPATH = $ PYTHONPATH中:/ opt /资料夹中:/ opt /文件夹2
/选择/文件夹1 /富
/选择/文件夹2 /富
并且,如果您尝试导入foo文件,python将不知道您想要哪一个。
来自foo import ... >>> importerror:没有名为foo的模块
Linux:导入的模块位于/usr/local/lib/python2.7/dist-packages中
如果您使用的是用C语言编译的模块,请不要忘记在sudo setup.py install
之后chmod .so文件。
sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
我的两分钱:
吐:
Traceback (most recent call last):
File "bash\bash.py", line 454, in main
import bosh
File "Wrye Bash Launcher.pyw", line 63, in load_module
mod = imp.load_source(fullname,filename+ext,fp)
File "bash\bosh.py", line 69, in <module>
from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
ImportError: No module named RecordGroups
这让我感到困惑 - 通过帖子和帖子暗示丑陋的syspath hacks(你看到我的__init__.py
都在那里)。事实证明,游戏/ oblivion.py和游戏/遗忘令人困惑的python吐出了相当无益的“没有名为RecordGroups的模块”。我对一个解决方法和/或记录这个(同名)行为的链接感兴趣 - >编辑(2017.01.24) - 看看What If I Have a Module and a Package With The Same Name?有趣的是,通常包装优先,但显然我们的发射器违反了这一点。
编辑(2015.01.17):我没有提到我们使用custom launcher解剖here。
你正在读这个答案说你的__init__.py
在正确的地方,你已经安装了所有依赖项,你仍然得到ImportError
。
我遇到了类似的问题,除了我的程序在使用PyCharm运行时运行正常,但是当我从终端运行它时出现上述错误。经过深入挖掘后,我发现PYTHONPATH
没有项目目录的条目。所以,我按照PYTHONPATH
设置Import statement works on PyCharm but not from terminal:
export PYTHONPATH=$PYTHONPATH:`pwd` (OR your project root directory)
使用sys.path
可以采用另一种方法:
import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')
您可以根据搜索项目的顺序使用insert / append。
在我的情况下,问题是我链接到调试python
和boost::Python
,这要求扩展名为FooLib_d.pyd
,而不仅仅是FooLib.pyd
;重命名文件或更新CMakeLists.txt
属性修复了错误。
我的问题是我将带有__init__.py
文件的目录添加到PYTHONPATH,实际上我需要添加其父目录。
如果您已尝试上面提供的所有方法但失败了,那么您的模块可能与内置模块具有相同的名称。或者,具有相同名称的模块存在于sys.path
中具有高于您的模块的优先级的文件夹中。
调试,说你的from foo.bar import baz
投诉ImportError: No module named bar
。改为import foo; print foo
,这将显示foo
的路径。这是你期望的吗?
如果没有,请重命名foo
或使用absolute imports。
在我的情况下,因为我正在使用PyCharm和PyCharm为项目文件夹中的每个项目创建一个'venv',但它只是python的迷你环境。虽然您已经在Python中安装了所需的库,但是在自定义项目“venv”中,它不可用。这是PyCharm中出现'ImportError:没有名为xxxxxx的模块'的真正原因。要解决此问题,您必须通过以下步骤将库添加到项目自定义环境中:
请享用。
通过编写print (sys.path)
解决了我的问题,并发现尽管安装干净,python仍在使用过时的软件包。删除这些make python会自动使用正确的包。
对所有仍然有这个问题的人。我相信Pycharm会对进口产品感到困惑。对我来说,当我写'从命名空间导入某些东西'时,前一行用红色加下划线,表示存在错误,但有效。然而,'。from .namespace import something'没有加下划线,但也不起作用。
尝试
try:
from namespace import something
except NameError:
from .namespace import something
是否
(local directory)/site-packages/toolkit
有一个__init__.py
?
要使导入遍历您的目录,每个目录必须具有__init__.py
文件。
在遇到同样的问题后,我发现我的解决方案是从我的项目中删除所有pyc
文件,似乎这些缓存的文件以某种方式导致此错误。
我发现这样做的最简单方法是导航到Windows资源管理器中的项目文件夹并搜索*.pyc
,然后选择全部(Ctrl + A)并删除它们(Ctrl + X)。
我可以通过删除特定的pyc
文件解决我的问题,但我从未尝试过
我遇到了同样的问题:Import error
。此外,该库已正确安装100%。问题的根源是我的PC上安装了3版本的python(anaconda数据包)。这就是为什么图书馆没有安装到正确的地方。之后我在我的IDE PyCharm中更改为正确版本的python。
我有同样的错误。这是因为有人在我的脚本所在的文件夹中创建了一个文件夹,其名称与我从其他地方导入的模块冲突。它没有导入外部模块,而是查看了这个文件夹,它显然没有包含预期的模块。
我有同样的问题(Python 2.7 Linux),我找到了解决方案,我想分享它。在我的情况下,我有以下结构:
Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py
在'main.py'中我尝试了以下所有组合失败:
from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...
解决方案比我想象的要简单得多。我将文件夹“Booklet”重命名为“booklet”,就是这样。现在Python可以通过在'main.py'中使用代码来正常导入类问题:
from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass
由此可以得出结论,像'booklet'这样的Package-Names(文件夹)必须从小写开始,否则Python会将它与类名和文件名混淆。
显然,这不是你的问题,但John Fouhy的答案非常好,这个帖子几乎可以引起这个问题。所以,这还有一件事,我希望也许这可以帮助别人。
在我的情况下,我包括package.egg文件夹的路径,而不是下面的实际包。我将包复制到顶层并且有效。
这对我有用:在父文件夹中创建__init__.py
文件(在你的情况下,在site-packages
文件夹中)。并像这样导入:
from site-packages.toolkit.interface import interface
希望它对你也有用!
在* nix上,还要确保正确配置PYTHONPATH,尤其是它具有以下格式:
.:/usr/local/lib/python
(在开头时记住.:
,以便它也可以搜索当前目录。)
它也可能在其他位置,具体取决于版本:
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
当我在LPTHW做这个练习时,我碰到了一些非常相似的东西;我永远无法让Python认识到我在调用的目录中有文件。但我最终能够让它发挥作用。我做了什么,我推荐的是试试这个:
(注意:从你的初始帖子开始,我假设你正在使用一个基于* NIX的机器,并且正在从命令行运行东西,所以这个建议是专门针对那些。因为我运行Ubuntu,这就是我所做的)
1)将目录(cd)更改为文件所在目录上方的目录。在这种情况下,您尝试运行mountain.py
文件,并尝试调用toolkit.interface.py
模块,这些模块位于不同的目录中。在这种情况下,您将转到包含这两个文件的路径的目录(换句话说,这两个文件的路径共享的最近目录)。在这种情况下,toolkit
目录。
2)当您在tookit
目录中时,在命令行中输入以下代码行:
export PYTHONPATH=.
这会将您的PYTHONPATH设置为“。”,这基本上意味着您的PYTHONPATH现在将查找您当前所在目录中的任何被调用文件(以及更多,直到您所在目录的子目录分支中)。所以它不只是查看当前目录,而是查看当前目录中的所有目录。
3)在上面的步骤中设置PYTHONPATH后,从当前目录(toolkit
目录)运行模块。 Python现在应该找到并加载您指定的模块。
希望这可以帮助。我自己很沮丧。
我解决了自己的问题,我将写出错误和解决方案的摘要:
该文件需要完全调用__init__.py
。如果扩展名不同,例如在我的情况下.py.bin
,那么Python无法在目录中移动,然后它无法找到模块。要编辑文件,您需要使用Linux编辑器,例如vi或nano。如果您使用Windows编辑器,这将写入一些隐藏的字符。
另一个影响它的问题是我有另一个由root安装的Python版本,所以如果有人正在使用python的本地安装,请确保运行程序的Python安装是本地Python。要检查这一点,只需执行which python
,然后查看可执行文件是否是本地目录中的可执行文件。如果没有,请更改路径,但要确保本地Python目录比其他Python更早。
要将目录标记为包,您需要一个名为__init__.py
的文件,这有用吗?
一个简单的解决方案是使用python -m pip install <library-name>
而不是pip install <library-name>
安装模块你可以在管理员限制的情况下使用sudo
使用PyCharm
(JetBrains套件的一部分),您需要将脚本目录定义为Source:
Right Click > Mark Directory as > Sources Root
对。您需要该目录包含__init__.py
文件,该文件是初始化程序包的文件。在这里,看看this。
需要__init__.py文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块。在最简单的情况下,__ init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后描述。