python安装在本地目录中。
我的目录树如下:
1
| (local directory)/site-packages/toolkit/interface.py |
我的代码在这里:
1
| (local directory)/site-packages/toolkit/examples/mountain.py |
为了运行这个例子,我编写了python mountain.py,在代码中我有:
1
| from toolkit.interface import interface |
我得到了错误:
1 2 3 4
| 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中找不到文件。有什么想法吗?这会是权限问题吗?我需要执行许可吗?
- @洛特:事实上,最初的问题是说init.py.bin,也许这就是重点……(?)
- @费德里科:我刚把它格式化了。我没试着回答。
- @另一个使我迷惑的问题是有两个安装,一个由根目录执行,另一个由我执行。
- 我有同样的ImportError:问题,但我觉得这可能是因为我在Mac上安装了多个python,它们没有正确地链接到我的项目。有什么建议吗?
- 检查您是否具有从python读取该文件的权限。请参阅:stackoverflow.com/a/20999950/1657225
- 请确保将目录标记为"resources root",以便让pycharm知道这是一个包。
- 在我的案例中,问题是新安装模块的许可不是755。这是因为机器上的umask是0027,因此others没有read权限,导致模块无法读取。添加read许可解决了我的问题。安装后检查目标目录的权限是值得的。
- 尝试打开url:stackoverflow.com/questions/47887614/…
- 可能本地目录名是interface(有冲突)。
根据你对ORIP帖子的评论,我想这就是发生的事情:
您在Windows上编辑了__init__.py。
Windows编辑器添加了一些非打印内容,可能是回车(Windows中的行尾是cr/lf;在UNIX中是lf),也可能是ctrl-z(Windows文件尾)。
您使用winscp将文件复制到您的Unix设备。
winscp想:"这有一些不是基本文本的东西;我会放一个.bin扩展名来表示二进制数据。"
缺少的__init__.py(现在称为__init__.py.bin)意味着python无法将工具箱理解为一个包。
你在适当的目录中创建__init__.py,一切都能正常工作…?
- 另外,python-c的"import sys;print sys.path"有助于——有时用户将文件放在未扫描的路径中。
- 我使用的是相同的东西,除了winscp没有附加.bin。
- 如果我有一个空的"初始"会发生同样的事情吗?
- 哦,你统治!这是我的故事:1。您在Windows 2上编辑了init.py。它添加了一个标签,而不是空格3。在找到这篇文章之前,你经常用谷歌搜索!;)
- 对我来说,问题是我使用python driver.py的时候,我应该使用python3 driver.py,因为我安装了pip3。
做
1
| (local directory)/site-packages/toolkit |
有__init__.py吗?
要使import遍历目录,每个目录都必须有一个__init__.py文件。
- 好点!备注:由于python 3.3,sys.path上任何与包名匹配的目录都将被识别出来。
- 这不只是相对路径引用所必需的吗?为什么每个目录都有它?
在*nix上,还要确保pythonpath配置正确,特别是它具有以下格式:
1
| .:/usr/local/lib/python |
(注意开头的.:,这样它也可以搜索当前目录。)
它也可能位于其他位置,具体取决于版本:
1 2 3
| .:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc. |
- 也可以是.:/usr/lib/python、.:/usr/lib/python2.6、.:/usr/lib/python2.7等,具体取决于版本。
- 对于我来说,模块在/usr/local/lib/python3.4/dist-packages中,但是当我在终端(ubuntu)中键入python3并尝试导入它时,它不允许我这样说它不存在。"导入错误:不存在模块x"
- 在文件末尾添加#!/usr/bin/python也可以,对吗?
- @尼禄,我想那不管用。另外,这个shebang通常被添加到文件的顶部。
- -1在pythonpath中列出python安装目录显然是错误的,并且显示出对这个变量的含义缺乏理解。
- 在MacOSX上,通过将pythonpath=/usr/local/lib/python2.7/site-packages添加到启动脚本来修复它。
在lpthw中做这个练习时,我遇到了非常类似的情况;我无法让python识别我在调用的目录中有文件。但最终我还是成功了。我所做的和我推荐的是尝试一下:
(注意:从您最初的帖子中,我假设您使用的是基于*nix的机器,并且正在从命令行运行这些东西,所以这个建议是专门针对这一点的。自从我运行Ubuntu以来,我就是这样做的)
1)将目录(cd)更改为文件所在目录的上方目录。在本例中,您尝试运行mountain.py文件,并尝试调用位于不同目录中的toolkit.interface.py模块。在这种情况下,您将转到包含这些文件的路径的目录(或者换句话说,两个文件的路径共享的最近的目录)。在本例中是toolkit目录。
2)当您在tookit目录中时,在命令行中输入以下代码行:
export PYTHONPATH=.
这将您的pythonpath设置为".",这基本上意味着您的pythonpath现在将在当前所在目录中查找任何被调用的文件,(更确切地说,是在您所在目录的子目录分支中)。因此,它不仅在当前目录中查找,而且在当前目录中的所有目录中查找)。
3)在上面的步骤中设置好pythonpath之后,从当前目录(toolkit目录)运行模块。python现在应该找到并加载您指定的模块。
希望这有帮助。我自己对此很失望。
- 或者在windows set PYTHONPATH=.上。
- 这对我有用。同时也完全简化了我的排便障碍,因为每次我切换机器时,都必须将其更新为绝对路径。谢谢你,谢谢你。
我解决了我自己的问题,我会写一个错误和解决方法的总结:
该文件需要准确地命名为__init__.py。如果扩展名是不同的,比如在我的例子中是.py.bin,那么python就不能在目录中移动,也就找不到模块。要编辑文件,需要使用Linux编辑器,如vi或nano。如果使用Windows编辑器,这将写入一些隐藏字符。
影响它的另一个问题是,根目录安装了另一个python版本,所以如果有人在本地安装python,请确保运行程序的python安装是本地python。要检查这一点,只需执行which python,并查看可执行文件是否在本地目录中。如果没有,请更改路径,但请确保本地python目录在其他python之前。
- 我遇到的一个问题是PIP安装了一个模块,只有根用户可以访问它,所以运行该程序的用户看不到它。
- @J_niselmeris能否就上述评论进行更详细的阐述,我认为我也面临着类似的错误。我将我的__init__.py文件放在相关目录中,但我使用setup.py手动安装了一个包。安装新软件包会如何影响导入。
- @抱歉,那是六年前的事了,我不记得了。另外,我很少和Python打交道,最近一点都没有。根据我写的内容,我可以认为我安装了一个包作为根,它更改了权限,使其他用户没有以前的访问权限。
要将目录标记为包,需要名为__init__.py的文件,这有帮助吗?
- 我已经有一个名为init.py.bin的文件,如果我将名称改为init.py,那么我会得到这个错误:/uu init_uuuuy",第1行"实用程序","演示"]^syntaxerror:无效语法
- init.py里有什么?请把它作为问题的一部分发出去。
- 什么都没有,它是空的,它和我下载的包在一起,我需要在文件中写些什么吗?.
- @洛特:你不需要把任何东西放进你的Init.py里,对吗?
- @爱德华多。你的init.py出错了。你说它是空的。这很难调和。它不能被称为init.py.bin——python会忽略这个文件。通常情况下,它不能包含任何内容。
- 你说得对,我用Windows编辑器编辑了文件,它写了一些隐藏字符,现在我用vi创建了新文件。
- @爱德华多:你可能想要得到程序员的记事本或科莫多编辑,或者一些没有隐藏特殊字符的纯文本编辑。它们可能比vi更容易使用。
- 感谢我通常使用nano进行编辑的建议,我使用Windows编辑器的原因是因为我在集群中工作,我使用winscp移动文件,有时我使用该编辑器来更改文件。
一个简单的解决方案是使用python -m pip install 而不是pip install 安装模块。如果有管理限制,您可以使用sudo。
- 在pip install之前,python -m实现了什么?
- @sporc-当您使用-m命令行标志时,python将为您导入一个模块或包,然后将其作为脚本运行。如果不使用-m标志,则命名的文件只作为脚本运行。
- 不知道这个答案到底想说什么,但是pip...没有:它们实际上是一样的,假设它们在同一个python目录中。可能的是,观察到的情况是,独立的pip程序在一些旧的python版本中不可用(但现在它在最新的2.7&3.x版本中)。在这种情况下,python位于本地virtualenv中,而pip不在本地virtualenv中,因此python -m pip install将安装在本地virtualenv中,而pip将尝试安装在系统python中(并在没有sudo的情况下失败)。无论如何,这是没有意义的。
使用PyCharm(JetBrains套件的一部分),您需要将脚本目录定义为源:Right Click > Mark Directory as > Sources Root
您必须将文件in it_uuu.py保存在您要导入的文件所在的目录中。
不能尝试从pythonpath上配置的2个文件夹中导入同名文件。
如:/ETC/环境
pythonpath=$pythonpath:/opt/folder1:/opt/folder2
/选择/文件夹1/foo
/选择/文件夹2/foo
而且,如果您试图导入foo文件,python将不知道您想要哪个文件。
从foo导入…>>>导入错误:没有名为foo的模块
是的。您需要目录包含__init__.py文件,该文件是初始化包的文件。这里,看看这个。
The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.
Linux:导入的模块位于/usr/local/lib/python2.7/dist-packages中
如果您使用的是C语言编译的模块,请不要忘记在sudo setup.py install之后对.so文件进行chmod。
1
| sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so |
我的两分钱:
唾液:
1 2 3 4 5 6 7 8
| 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 |
这把我搞糊涂了——浏览了一些帖子和帖子,上面提到了丑陋的系统路径黑客(如你所见,我的__init__.py)。原来game/oblivion.py和game/oblivion让python很困惑它指出了相当无用的"没有名为记录组的模块"。我会对记录这一(同名)行为的变通方法和/或链接感兴趣->编辑(2017.01.24)-看看如果我有一个模块和一个同名的包该怎么办?有趣的是,通常包优先,但显然我们的启动程序违反了这一点。
编辑(2015.01.17):我没有提到我们使用了一个在这里解剖的自定义启动程序。
- 更像是路径关闭了。game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py可能想通过附加要使用的python代码来解决这个问题:game.oblivion.patchers.RecordGroups。
- @德怀特斯宾塞:我确定我在game.oblivion.__init__.py中导入了"记录组",但可能需要检查这个
在我的例子中,问题是我链接到调试python&boost::Python,这要求扩展名为FooLib_d.pyd,而不仅仅是FooLib.pyd;重命名文件或更新CMakeLists.txt属性修复了错误。
我的问题是,在实际需要添加其父目录时,我将带有__init__.py文件的目录添加到pythonpath。
你在阅读这个答案时说你的__init__.py在正确的位置,你已经安装了所有的依赖项,你仍然得到ImportError。
我遇到了一个类似的问题,除了我的程序在使用pycharm运行时可以正常运行,但是当我从终端运行它时,上面的错误是这样的。在进一步挖掘之后,我发现PYTHONPATH没有项目目录条目。因此,我将每份进口声明中的PYTHONPATH设置为pycharm,而不是从终端:
1
| export PYTHONPATH=$PYTHONPATH:`pwd` (OR your project root directory) |
使用sys.path还有另一种方法可以做到这一点:
1 2 3
| import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>') |
可以根据要搜索项目的顺序使用插入/追加。
如果您尝试了上面提供的所有方法,但失败了,那么您的模块可能与内置模块同名。或者,文件夹中存在与模块同名的模块,该文件夹在sys.path中的优先级高于模块的优先级。
要调试,请说您的from foo.bar import baz投诉ImportError: No module named bar。改为import foo; print foo,显示foo的路径。这是你所期望的吗?
如果没有,请重命名foo或使用绝对导入。
- 对我来说,这就产生了ImportError: No module named foo。
通过编写print (sys.path)解决了我的问题,发现尽管安装很干净,但python仍在使用过时的包。删除这些使python自动使用正确的包。
我也面临同样的问题:Import error。此外,库已100%正确安装。问题的根源是我的pc 3版本的python(Python包)已经安装。这就是为什么库被安装到正确的位置。在那之后,我在我的IDepycharm中改成了正确的Python版本。
这对我很有用:在父文件夹中创建了__init__.py文件(在您的情况下,在site-packages文件夹中)。像这样导入:
1
| from site-packages.toolkit.interface import interface |
希望对您也有帮助!
我也有同样的错误。这是因为有人在我的脚本所在的文件夹中创建了一个文件夹,该文件夹的名称与我从其他地方导入的模块相冲突。它没有导入外部模块,而是在这个文件夹中查找显然不包含预期模块的内容。
我有同样的问题(python 2.7linux),我已经找到了解决方案,我想和大家分享一下。在我的案例中,我的结构如下:
1 2 3 4 5 6 7
| Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py |
在"main.py"中,我尝试了以下所有组合,但没有成功:
1 2 3 4 5 6
| 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 ... |
解决方案比我想象的要简单得多。我把文件夹"小册子"改名为"小册子",就这样。现在,python可以通过在"main.py"中使用以下代码来正常导入类问题:
1 2 3
| from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass |
由此我可以得出结论,包名(文件夹)如"小册子"必须从小写开始,否则Python会将其与类名和文件名混淆。
显然,这不是你的问题,但是约翰·福伊的回答很好,而且这条线几乎有任何可能引起这个问题的东西。所以,这是另外一件事,我希望这能帮助其他人。
在我的例子中,我包含了package.egg文件夹的路径,而不是下面的实际包。我把这个包复制到了顶层,它工作了。
在我的例子中,因为我正在使用pycharm和pycharm为项目文件夹中的每个项目创建一个"venv",但它只是python的一个迷你env。虽然您已经在python中安装了所需的库,但在自定义项目"venv"中,它不可用。这是"importError:Pycharm中没有名为xxxx的模块"的真正原因。要解决此问题,必须通过以下步骤将库添加到项目自定义环境中:
- 在pycharm中,从菜单"文件"->设置
- 在设置对话框中,项目:XXXProject->Project解释器
- 单击"添加"按钮,将显示"可用程序包"对话框。
- 搜索库,单击"安装软件包"
- 然后,所有您需要的软件包将安装在您的项目自定义"venv"文件夹中。
享受。
在经历了同样的问题之后,我发现我的解决方案是从我的项目中删除所有pyc文件,似乎这些缓存的文件不知何故导致了这个错误。
最简单的方法是在Windows资源管理器中导航到我的项目文件夹并搜索*.pyc,然后选择全部(ctrl+a),然后删除它们(ctrl+x)。
我可以通过删除特定的pyc文件来解决我的问题,但我从未尝试过这样做。