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指示这是一个软件包。 我在示例目录中也有一个__init__.py.bin
。
我不知道为什么在sys.path
时Python无法找到该文件。 有任何想法吗? 可以是权限问题吗? 我需要执行许可吗?
#1楼
就我而言,问题是我链接到调试 python
& boost::Python
,它要求扩展名是FooLib_d.pyd
,而不仅仅是FooLib.pyd
; 重命名文件或更新CMakeLists.txt
属性CMakeLists.txt
该错误。
#2楼
- 您必须在与要导入文件相同的目录中拥有文件__ init__.py。
- 您不能尝试从PYTHONPATH上配置的2个文件夹中导入具有相同名称的文件。
例如:/ etc / environment
PYTHONPATH = $ PYTHONPATH:/ opt /文件夹1:/ opt /文件夹2
/ opt / folder1 / foo
/ opt / folder2 / foo
并且,如果您尝试导入foo文件,python将不知道您要哪个。
从foo import ... >>> importerror:没有名为foo的模块
#3楼
我在LPTHW中进行此练习时遇到了非常相似的事情。 我永远无法让Python识别出我正在从其调用的目录中有文件。 但是我最终能够使它工作。 我所做的以及我的建议是尝试以下操作:
(注意:从您的第一篇文章中,我假设您使用的是基于* NIX的计算机,并且正在通过命令行运行,因此此建议是针对性的。自从我运行Ubuntu以来,我就是这样做的。
1)将目录(cd)更改为文件所在目录上方的目录。 在这种情况下,您将尝试运行mountain.py
文件,并尝试调用在单独目录中的toolkit.interface.py
模块。 在这种情况下,您将转到包含两个文件路径的目录(或换句话说,这两个文件的路径共享的最近目录)。 在这种情况下,该目录是toolkit
目录。
2)在tookit
目录中时,在命令行上输入以下代码行:
export PYTHONPATH=.
这会将您的PYTHONPATH设置为“。”,这基本上意味着您的PYTHONPATH现在将在您当前所在目录(甚至更重要的是,您所在目录的子目录分支)中查找所有被调用的文件。因此,它不只是看在你的当前目录,但在所有的, 在您的当前目录)的目录。
3)在上述步骤中设置PYTHONPATH之后,请从当前目录( toolkit
目录)运行模块。 Python现在应该找到并加载您指定的模块。
希望这可以帮助。 我自己对此感到非常沮丧。
#4楼
Linux:导入的模块位于/usr/local/lib/python2.7/dist-packages中
如果您使用的是用C语言编译的模块,请不要忘记在sudo setup.py install
之后对.so文件进行chmod。
sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
#5楼
在经历了同样的问题后,我发现我的解决方法是从项目中删除所有pyc
文件,似乎这些缓存的文件以某种方式导致了此错误。
我发现最简单的方法是在Windows资源管理器中导航到我的项目文件夹,并搜索*.pyc
,然后选择所有( Ctrl + A )并删除它们( Ctrl + X )。
可能我可以通过删除特定的pyc
文件来解决问题,但我从未尝试过
#6楼
我的两分钱:
吐:
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
都在那里)。 好吧,事实证明game / oblivion.py和game / oblivion使python混淆了,它吐出了相当无用的“没有名为RecordGroups的模块”。 我对解决此问题和/或记录此(相同名称)行为的链接感兴趣->编辑(2017.01.24)-看看如果我具有相同名称的模块和软件包怎么办? 有趣的是,通常程序包具有优先权,但显然我们的启动器违反了这一点。
编辑(2015.01.17):我没有提到我们使用此处剖析的自定义启动器 。
#7楼
要将目录标记为包,您需要一个名为__init__.py
的文件,这有帮助吗?
#8楼
是否
(local directory)/site-packages/toolkit
有一个__init__.py
吗?
为了使通过你的目录导入步行每个目录必须有一个__init__.py
文件。
#9楼
根据您对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
,一切正常...?
#10楼
我解决了自己的问题,并将总结出错误的地方和解决方案:
该文件需要精确地称为__init__.py
。 如果扩展名不同(例如在我的情况下为.py.bin
则Python无法在目录中移动,因此找不到模块。 要编辑文件,您需要使用Linux编辑器,例如vi或nano 。 如果您使用Windows编辑器,则会写一些隐藏的字符。
另一个影响它的问题是我的根目录安装了另一个Python版本,因此,如果有人正在使用python的本地安装,请确保运行程序的Python安装是本地Python。 要检查这一点,只需执行which python
,然后查看可执行文件是否在您本地目录中即可。 如果不是,请更改路径,但请确保本地Python目录位于另一个Python目录之前。
#11楼
我遇到了同样的问题: Import error
。 此外,该库已正确安装了100%。 问题的根源是在我的PC 3版本上安装了python(anaconda数据包)。 这就是为什么没有将库安装到正确的位置的原因。 之后,我只是在我的IDE PyCharm中更改为python的正确版本。
#12楼
通过编写print (sys.path)
修复了我的问题,发现尽管进行了全新安装,python仍在使用过期软件包。 删除这些使python自动使用正确的软件包。
#13楼
我有同样的错误。 这是因为有人在与脚本相同的文件夹中创建了一个文件夹,该文件夹的名称与我从其他位置导入的模块冲突。 它没有导入外部模块,而是查看了该文件夹内部,该文件夹显然不包含预期的模块。
#14楼
使用PyCharm
(JetBrains套件的一部分),您需要将脚本目录定义为Source: Right Click > Mark Directory as > Sources Root
#15楼
对。 您需要该目录包含__init__.py
文件,该文件是用于初始化程序包的文件。 在这里,看看这个 。
__init__.py文件是使Python将目录视为包含包所必需的; 这样做是为了防止具有通用名称(例如字符串)的目录无意间隐藏了稍后在模块搜索路径中出现的有效模块。 在最简单的情况下,__init__.py可以只是一个空文件,但它也可以为该程序包执行初始化代码或设置__all__变量,如后所述。
#16楼
如果您尝试了上面提供的所有方法但都失败了,则也许您的模块与内置模块具有相同的名称 。 或者,存在于文件夹中的同名模块在sys.path
比模块具有更高的优先级。
要进行调试,请说您from foo.bar import baz
抱怨ImportError: No module named bar
。 更改为import foo; print foo
import foo; print foo
,它将显示foo
的路径。 是您所期望的吗?
如果不是,请重命名foo
或使用absolute imports 。
#17楼
一个简单的解决方案是使用python -m pip install <library-name>
而不是pip install <library-name>
安装模块,如果受管理员限制,可以使用sudo
#18楼
我的问题是,实际上需要添加其父目录时,我已将带有__init__.py
文件的目录添加到PYTHONPATH。
#19楼
我遇到了同样的问题(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”中使用以下代码来正常导入Question类:
from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass
由此我可以得出结论,像“小册子”之类的包名称(文件夹)必须以小写字母开头,否则Python会将其与类名和文件名混淆。
显然,这不是您的问题,但是John Fouhy的回答非常好,并且该线程几乎可以导致此问题。 因此,这是一回事,我希望这可以对其他人有所帮助。
#20楼
就我而言,我要包含package.egg文件夹的路径,而不是其下面的实际软件包。 我将软件包复制到顶层,并且可以正常工作。
#21楼
在* nix上,还要确保正确配置了PYTHONPATH,尤其是它具有以下格式:
.:/usr/local/lib/python
(请注意开头的.:
,以便它也可以在当前目录中搜索。)
它也可能在其他位置,具体取决于版本:
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
#22楼
您正在阅读此答案,指出__init__.py
在正确的位置,您已经安装了所有依赖项,并且仍在获取ImportError
。
我遇到了类似的问题,除了我的程序在使用PyCharm运行时可以正常运行,但是当我从终端运行它时出现了上述错误。 进一步挖掘之后,我发现PYTHONPATH
没有项目目录的条目。 因此,我在PyCharm上对每个Import语句设置了PYTHONPATH
, 但没有从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>')
您可以根据要搜索项目的顺序使用插入/追加。
#23楼
就我而言,因为我正在使用PyCharm和PyCharm在项目文件夹中为每个项目创建一个“ venv”,但这只是python的一个迷你环境。 尽管您已经在Python中安装了所需的库,但是在您的自定义项目“ venv”中,该库不可用。 这是PyCharm中发生“导入错误:没有名为xxxxxx的模块”的真正原因。 要解决此问题,必须通过以下步骤将库添加到项目自定义环境中:
- 在PyCharm中,从菜单“文件”->“设置”
- 在设置对话框中,项目:XXXProject->项目解释器
- 点击“添加”按钮,它将显示“可用包”对话框
- 搜索您的库,单击“安装软件包”
- 然后,所有需要的软件包将安装在项目自定义“ venv”文件夹中。
请享用。
#24楼
这对我__init__.py
:在父文件夹中创建__init__.py
文件(在您的情况下,在site-packages
文件夹中)。 并像这样导入:
from site-packages.toolkit.interface import interface
希望它对您也有用!
#25楼
对于所有仍然有此问题的人。 我相信Pycharm与进口商品混淆了。 对我来说,当我写“从名称空间导入某物”时,前一行用红色下划线标出,表示有错误,但可以。 但是,“从.namespace导入某些内容”不会带有下划线,但也无法正常工作。
尝试
try:
from namespace import something
except NameError:
from .namespace import something
#26楼
对我来说,那真是愚蠢。 我使用pip3 install
安装了该库,但是将程序作为python program.py
运行,而不是python3 program.py
。 就像有时候¯\\_(ツ)_/¯
。