Python错误“ ImportError:未命名模块”


452

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。另外,我__init__.py.bin在toolkit文件夹中有该文件,以向Python指示这是一个软件包。我__init__.py.bin在示例目录中也有一个。

我不知道为什么Python在时找不到文件sys.path。有任何想法吗?可以是权限问题吗?我需要执行许可吗?


3
检查您是否具有从python对该文件的读取权限。请参阅:stackoverflow.com/a/20999950/1657225
cSn 2014年

1
请确保将目录标记为“ Resources Root”,以使PyCharm知道这是一个软件包。
emmmphd

在我的情况下,问题是新安装的模块没有权限755。那是因为umask在机器上是0027由于others没有read权限导致模块无法读取。添加read权限解决了我的问题。值得在安装后检查目标目录的权限。
阿努


本地目录名称可能是interface (已经发生冲突)。
本雅明·贾法里

Answers:


267

根据您对orip帖子的评论,我想这是发生了什么:

  1. __init__.py在Windows上进行了编辑。
  2. Windows编辑器添加了一些不可打印的内容,也许是回车符(Windows中的行尾是CR / LF;在Unix中是LF),或者是CTRL-Z(Windows文件末尾)。
  3. 您使用WinSCP将文件复制到Unix框中。
  4. WinSCP认为:“这不是基本文字;我将添加.bin扩展名以指示二进制数据。”
  5. 缺少__init__.py(现在称为__init__.py.bin)意味着python无法将工具包理解为一个包。
  6. __init__.py在适当的目录中创建,一切正常...?

50
另外,python -c'import sys; print sys.path的帮助-有时用户将文件放置在未扫描的路径中。
mikebabcock 2012年

1
除了WinSCP没有追加外,我正在使用相同的东西.bin
用户

9
如果我有一个空的“ __init__.py”,会发生同样的事情吗?
Dietbacon 2014年

2
天哪,你统治!这是我的故事:1.您在Windows上编辑了init .py。2.它添加了一个TAB而不是空格。3.您在谷歌上搜索了很多东西,直到找到这篇文章!;)
GBrian

1
对我来说,问题是自从我安装以来python driver.py,我应该在何时应该使用。python3 driver.pypip3
Eric Wiener

72

是否

(local directory)/site-packages/toolkit

有一个__init__.py

为了使进口步行通过你的目录中的每个目录必须有一个__init__.py文件。


1
好点子!备注:从Python 3.3开始,sys.path上任何名称与软件包名称匹配的目录都将被识别。
PatrickT

1
这不仅是相对路径引用所必需的吗?为什么每个目录都必须有它?
Sonic Soul,

56

我在LPTHW中进行此练习时遇到了非常相似的事情。我永远无法让Python识别出我正在从其调用的目录中有文件。但是我最终能够使它工作。我所做的以及我的建议是尝试以下操作:

(注意:从您的第一篇文章中,我假设您使用的是基于* NIX的计算机,并且正在通过命令行运行,因此此建议是针对性的。自从我运行Ubuntu以来,我就是这样做的。)

1)将目录(cd)更改为文件所在目录上方的目录。在这种情况下,您将尝试运行mountain.py文件,并尝试调用toolkit.interface.py位于单独目录中的模块。在这种情况下,您将转到包含两个文件路径的目录(或换句话说,这两个文件的路径共享的最近目录)。在这种情况下是toolkit目录。

2)在tookit目录中时,在命令行上输入以下代码行:

export PYTHONPATH=.

这会将您的PYTHONPATH设置为“。”,这基本上意味着您的PYTHONPATH现在将在您当前所在目录(甚至更重要的是,您所在目录的子目录分支)中查找所有被调用的文件。因此,它不只是看在你的当前目录,但在所有可在目录中的当前目录)。

3)在上述步骤中设置完PYTHONPATH之后,请从当前目录(该toolkit目录)运行模块。Python现在应该找到并加载您指定的模块。

希望这可以帮助。我自己对此感到非常沮丧。


2
或在Windows上set PYTHONPATH=.
cjbarth 2014年

这对我有用。另外,完全简化了我的PYTHONPATH挫败感,因为每次切换机器时都必须将其更新为绝对路径。谢谢你,谢谢你,谢谢你。
the_e

41

在* nix上,还要确保正确配置了PYTHONPATH,尤其是它具有以下格式:

 .:/usr/local/lib/python

(请注意.:开头,以便它也可以在当前目录中搜索。)

它也可能在其他位置,具体取决于版本:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
这也可能是.:/usr/lib/python.:/usr/lib/python2.6.:/usr/lib/python2.7等根据版本
尼基塔·沃尔科夫

对我来说,该模块位于/usr/local/lib/python3.4/dist-packages中,但是当我在终端(ubuntu)中键入python3并尝试导入时,它不允许我说,不存在。“ ImportError:不存在模块x”
user65165 '16

#!/usr/bin/python在文件末尾添加也应该可以,对吗?
Nearoo

1
@Nearoo我认为这行不通。另外,通常将该shebang添加到文件的顶部。
雷诺

2
在MacOSX上,通过将PYTHONPATH = / usr / local / lib / python2.7 / site-packages添加到启动脚本中进行了修复。
Johan Snowgoose

23

我解决了自己的问题,并将总结出错误的地方和解决方案:

该文件需要完全调用__init__.py。如果扩展名不同(例如在我的情况下),.py.bin则Python无法在目录中移动,因此找不到模块。要编辑文件,您需要使用Linux编辑器,例如vinano。如果您使用Windows编辑器,则会写一些隐藏的字符。

影响它的另一个问题是,我的根目录安装了另一个Python版本,因此,如果有人正在使用python的本地安装,请确保运行程序的Python安装是本地Python。要检查这一点,只需执行which python,然后查看可执行文件是否在您的本地目录中。如果不是,请更改路径,但请确保本地Python目录位于另一个Python目录之前。


我遇到的一个问题是pip仅由root用户访问(重新)安装了一个模块,因此运行该程序的用户没有看到它。
贾尼斯·埃默里斯(JānisElmeris)2012年

@JānisElmeris您能详细说明上述评论吗,我想我也面临类似的错误。我将__init__.py文件放在相关目录中,但是我使用手动安装了软件包setup.py。安装新软件包如何干扰进口。
克里希纳·奥扎

@darth_coder,对不起,那是六年前的事,我不记得了。另外,我很少处理Python,最近一点也不处理。从我写的内容来看,我可以认为我以root用户身份安装了一个软件包,该软件包更改了权限,以使其他用户没有以前的访问权限。
贾尼斯·埃默里斯(JānisElmeris)'18年

19

一个简单的解决方案是使用来安装模块,python -m pip install <library-name>而不是pip install <library-name> 在管理员限制的情况下使用sudo


2
是什么python -m在眼前实现pip install
sporc

1
@sporc-使用-m命令行标志时,Python将为您导入模块或包,然后将其作为脚本运行。当您不使用-m标志时,您命名的文件仅作为脚本运行。
Tony Ciccarone

不知道这个答案是什么意思python -m pip...,但是pip...并没有:假设它们实际上位于同一python目录中,它们实际上是同一件事。可能观察到的情况是,该独立pip程序在某些较旧的python版本中不可用(但现在是最新的2.7&3.x)。在这种情况下,python则在本地virtualenv中,pip而不在本地virtualenv 中,因此python -m pip install将其安装在本地virtualenv中,而pip将尝试安装在系统python中(并且不带sudo失败)。无论如何,这没有任何意义。
迈克尔

17

要将目录标记为包,您需要一个名为的文件__init__.py,这有帮助吗?


我已经有一个名为init .py.bin 的文件,如果我将名称更改为init .py,则出现此错误:/__init__.py“,第1行“实用程序”,“演示”] ^ SyntaxError:无效语法
爱德华多

什么是init .py?请把它张贴在您的问题中。
S.Lott,

什么都没有,它是空的,是我下载的软件包,我是否需要在文件中写一些东西?
爱德华多

@ S.Lott:您不需要在init .py中放入任何内容,对吗?
igorgue

1
@爱德华多 您的init .py出现错误。而且您说它是空的。这很难调和。它不能称为init .py.bin - Python将忽略此文件。通常,它里面什么也没有。
S.Lott,

16

使用PyCharm(属于JetBrains套件的一部分),您需要将脚本目录定义为Source:
Right Click > Mark Directory as > Sources Root


12

您正在阅读此答案,表明您__init__.py来对地方了,已经安装了所有依赖项,并且仍在获取ImportError

我遇到了类似的问题,除了我的程序在使用PyCharm运行时可以正常运行,但是当我从终端运行时出现上述错误。进一步挖掘之后,我发现PYTHONPATH该项目目录中没有该条目。因此,我将PYTHONPATH每个Import语句设置为在PyCharm上有效,但不能在terminal上使用

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

使用sys.pathas 的另一种方法是:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

您可以根据要搜索项目的顺序使用插入/追加。


12

对我来说,那真是愚蠢。我使用来安装该库,pip3 install但正在运行程序python program.py而不是python3 program.py


1
哇 !那也确实对我有用。
JavaDeveloper

1
你救了我的日子。
艾门

7

对。您需要包含该__init__.py文件的目录,该文件是用于初始化程序包的文件。在这里,看看这个

__init__.py文件是使Python将目录视为包含包所必需的;这样做是为了防止具有通用名称的目录(例如字符串)无意间隐藏了稍后在模块搜索路径中出现的有效模块。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以为该程序包执行初始化代码或设置__all__变量,如后所述。


6
  1. 您必须在与要导入文件相同的目录中拥有文件__ init__.py。
  2. 您不能尝试从PYTHONPATH上配置的2个文件夹中导入具有相同名称的文件。

例如:/ etc / environment

PYTHONPATH = $ PYTHONPATH:/ opt /文件夹1:/ opt /文件夹2

/ opt / folder1 / foo

/ opt / folder2 / foo

并且,如果您尝试导入foo文件,python将不知道您要哪个。

从foo import ... >>> importerror:没有名为foo的模块


5

我的两分钱:

在此处输入图片说明

吐:

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):我没有提到我们使用此处剖析的自定义启动器


更像是路不通了。game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py 可能想通过附加使用以下python代码来解决此问题:game.oblivion.patchers.RecordGroups
Dwight Spencer

@DwightSpencer:我确定我导入了“ RecordGroups”,game.oblivion.__init__.py但可能必须检查一下
Mr_and_Mrs_D 2015年

4

Linux:导入的模块位于/usr/local/lib/python2.7/dist-packages中

如果您使用的是用C语言编译的模块,请不要忘了在之后对.so文件进行chmod修改sudo setup.py install

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

3

就我而言,问题是我链接到debug pythonboost::Python,它要求扩展名是FooLib_d.pyd,而不仅仅是FooLib.pyd; 重命名文件或更新CMakeLists.txt属性可修复该错误。


3

如果您尝试了上面提供的所有方法但都失败了,则也许您的模块内置模块具有相同的名称。或者,文件夹中存在的同名sys.path模块比模块具有更高的优先级。

要调试,请说出您的from foo.bar import baz抱怨ImportError: No module named bar。更改为import foo; print foo,将显示的路径foo。是您所期望的吗?

如果不是,请重命名foo或使用绝对导入


1
对我来说,这产生了ImportError: No module named foo
亚历克斯

3

我的问题是,__init__.py实际上需要添加其父目录时,我将带有文件的目录添加到了PYTHONPATH中。


3

对于所有仍然有此问题的人。我相信Pycharm与进口商品混淆了。对我来说,当我写“从名称空间导入某物”时,前一行用红色下划线标出,表示有错误,但可以。但是,“从.namespace导入某些内容”不会带有下划线,但也无法正常工作。

尝试

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
第一个是2蟒语法,第二个是蟒3.
丹娘Branagan

2

通过编写修复了我的问题print (sys.path),发现尽管进行了全新安装,python仍在使用过期的软件包。删除这些使python自动使用正确的软件包。


2

就我而言,因为我正在使用PyCharm和PyCharm在项目文件夹中为每个项目创建一个“ venv”,但这只是python的一个迷你环境。尽管您已经在Python中安装了所需的库,但是在您的自定义项目“ venv”中,该库不可用。这是PyCharm中发生“导入错误:没有名为xxxxxx的模块”的真正原因。要解决此问题,必须通过以下步骤将库添加到项目自定义环境中:

  • 在PyCharm中,从菜单“文件”->“设置”
  • 在设置对话框中,项目:XXXProject->项目解释器
  • 点击“添加”按钮,它将显示“可用包”对话框
  • 搜索您的库,单击“安装软件包”
  • 然后,所有需要的软件包将安装在项目自定义“ venv”文件夹中。

设置对话框

请享用。


0

在经历了同样的问题后,我发现我的解决方案是pyc从项目中删除所有文件,似乎这些缓存的文件以某种方式导致了此错误。

我发现最简单的方法是在Windows资源管理器中导航到我的项目文件夹并搜索*.pyc,然后选择所有(Ctrl+ A)并删除它们(Ctrl+ X)。

可能我可以通过删除特定pyc文件来解决问题,但我从未尝试过


0

我遇到了同样的问题:Import error。此外,该库已正确安装了100%。问题的根源是在我的PC 3版本上安装了python(anaconda数据包)。这就是为什么没有将库安装到正确的位置的原因。之后,我只是在我的IDE PyCharm中更改为python的正确版本。


0

我有同样的错误。这是因为有人在与脚本相同的文件夹中创建了一个文件夹,该文件夹的名称与我从其他位置导入的模块冲突。它没有导入外部模块,而是查看了该文件夹内部,该文件夹显然不包含预期的模块。


0

我遇到了同样的问题(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的回答非常好,并且该线程具有几乎所有可能导致此问题的东西。因此,这是一回事,我希望这可以对其他人有所帮助。


0

就我而言,我要包含package.egg文件夹的路径,而不是其下面的实际软件包。我将软件包复制到顶层,并且可以正常工作。


0

这对我有用:__init__.py在父文件夹中创建文件(在您的情况下,在site-packages文件夹中)。并像这样导入:

from site-packages.toolkit.interface import interface

希望它对您也有用!


0

在linux服务器上尝试 dos2unix script_name

pyc使用命令删除所有(如果有的话)文件find . -name '*.pyc' -delete

如果您在Windows上处理脚本,请重新运行


0

就我而言,我是sys.path.insert()用来导入本地模块的,并且是module not found从另一个库中获取的。我不得不把sys.path.insert()进口的商品放在下面module not found。我想最好的做法是放在sys.path.insert()进口的底部。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.