Python错误 "ImportError: No module named"

621

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来告诉Python这是一个包。我还在示例目录中有一个__init__.py.bin

我不知道为什么Python在sys.path中找不到该文件。有什么想法吗?可能是权限问题吗?需要一些执行权限吗?


4
确保你在Python中有该文件的读取权限。 参考链接:https://dev59.com/E2Qm5IYBdhLWcg3w6ShR#20999950 - cSn
2
请务必将您的目录标记为“资源根目录”,以便PyCharm知道这是一个包。 - Yushan ZHANG
在我的情况下,问题是新安装的模块的权限不是“755”。这是因为机器上的“umask”是“0027”,导致“其他人”没有“读取”权限,导致模块无法读取。添加“读取”权限解决了我的问题。建议在安装后检查目标目录的权限。 - anu
尝试访问以下网址: https://stackoverflow.com/questions/47887614/how-to-import-module-or-a-file-from-subfolder-in-python/47887660#47887660 - Rawan-25
我该如何将我的目录标记为“资源根目录”?https://stackoverflow.com/users/6829195/yushan-zhang - skittlebiz
显示剩余4条评论
38个回答

9
对于仍然存在这个问题的所有人,我认为Pycharm在导入时会出现混淆。对于我而言,当我写'from namespace import something'时,前一行会被标为红色下划线,表示存在错误,但程序可以正常工作。然而,'from .namespace import something'不会被标为下划线,但也无法正常工作。
尝试:
try:
    from namespace import something 
except NameError:
    from .namespace import something

3
第一种是Python 2的语法,第二种是Python 3的。 - Tanya Branagan

7
如果您已经尝试了以上所有方法,但仍然失败了,可能是因为您的模块与内置模块名称相同。或者,一个名称相同的模块存在于一个比您的模块更高优先级的文件夹中的路径sys.path
要进行调试,请假设您的from foo.bar import baz投诉ImportError:没有名为bar的模块。更改为import foo; print foo,这将显示foo的路径。这是您所期望的吗?
如果不是,请将foo重命名或使用绝对导入

1
对我来说,这会产生“ImportError: No module named foo”的错误。 - alex

7
是的,你需要在目录中包含__init__.py文件,这个文件是初始化包的文件。点击这里查看。

为了让Python将目录视为包含包,需要使用__init__.py文件;这样做是为了防止具有相同名称(例如string)的目录无意中隐藏在模块搜索路径后面的有效模块。在最简单的情况下,__init__.py可以是一个空文件,但它也可以执行包的初始化代码或设置稍后描述的__all__变量。


6

我的意见:

enter image description here

吐出:

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 hack(如你所见,我的__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:我确定我在 game.oblivion.__init__.py 中导入了 "RecordGroups",但可能需要检查一下。 - Mr_and_Mrs_D

5
  1. 你必须在与你导入的文件相同的目录中拥有__ init__.py文件。
  2. 你不能尝试导入一个与PYTHONPATH上配置的两个文件夹中的文件同名的文件。

例如:

/etc/environment

PYTHONPATH=$PYTHONPATH:/opt/folder1:/opt/folder2

/opt/folder1/foo

/opt/folder2/foo

如果你正在尝试导入foo文件,Python将不知道你想要哪一个。

from foo import ... >>> ImportError: No module named foo


4
在我的情况下,因为我使用PyCharm,而PyCharm会在项目文件夹中为每个项目创建一个名为“venv”的小型Python环境。尽管您已经在Python中安装了所需的库,但在您的自定义项目“venv”中无法使用它们。这是在PyCharm中出现“ImportError: No module named xxxxxx”的真正原因。
要解决此问题,您必须通过以下步骤将库添加到您的项目自定义环境中:
- 在PyCharm中,从菜单“文件”->“设置”中选择。 - 在设置对话框中,选择项目:XXXProject->项目解释器。 - 单击“添加”按钮,它会显示“可用软件包”对话框。 - 搜索您的库,单击“安装软件包”。 - 然后,所有您需要的软件包都将安装在您的项目自定义“venv”文件夹中。

Settings dialog

享受。


4

通过编写 print (sys.path),我解决了我的问题,并发现尽管进行了干净的安装,但Python仍在使用过时的软件包。删除这些软件包会使Python自动使用正确的软件包。


4
在我的情况下,问题出在我链接了debug pythonboost::Python,这需要扩展名为FooLib_d.pyd而不仅仅是FooLib.pyd;重命名文件或更新CMakeLists.txt属性可以修复错误。

4

对我来说,将文件作为模块运行有所帮助。

与其使用

python myapp/app.py

使用

python -m myapp.app

虽然不完全相同,但在某些情况下可能是更好的方法。


我不知道 myapp\appmyapp/appmyapp/app.pymyapp\app.pymyapp.app 的含义,但这个修复了它。 - Ian Boyd

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接