Python错误 "ImportError: 没有名为的模块

628 投票
38 回答
2471963 浏览
提问于 2025-04-11 19:34

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里。有没有什么想法?这会不会是权限问题?我需要什么执行权限吗?

38 个回答

106

我在做LPTHW的练习时遇到过类似的问题;我一直无法让Python识别我在调用的目录里有文件。不过最后我还是搞定了。我的做法,以及我推荐的做法是这样的:

(注意:根据你最初的帖子,我假设你是在一个基于*NIX的机器上,并且是通过命令行来运行的,所以这些建议是针对这种情况的。因为我使用的是Ubuntu,所以我做了以下操作)

  1. 首先,使用命令行切换到你文件所在目录的上一级目录。比如说,你想运行mountain.py文件,并且要调用toolkit.interface.py模块,这两个文件在不同的目录里。在这种情况下,你需要进入一个包含这两个文件路径的目录(换句话说,就是这两个文件路径最近的共同目录)。在这个例子中,就是toolkit目录。

  2. 当你在toolkit目录时,在命令行输入这一行代码:

    export PYTHONPATH=.

    这条命令是把你的PYTHONPATH设置为“.”,这基本上意味着你的PYTHONPATH现在会在你当前所在的目录里寻找任何被调用的文件(更准确地说,是在你当前目录的子目录中寻找)。所以它不仅仅会在你当前的目录里查找,还会在所有位于你当前目录下的目录中查找。

  3. 在你设置好PYTHONPATH之后,从你当前的目录(即toolkit目录)运行你的模块。Python现在应该能够找到并加载你指定的模块。

326

根据你对orip帖子里的评论,我猜事情是这样的:

  1. 你在Windows上编辑了__init__.py文件。
  2. Windows的编辑器可能添加了一些看不见的字符,比如换行符(在Windows中,换行是CR/LF;而在Unix中,只有LF),或者可能是CTRL-Z(表示文件结束)。
  3. 你用WinSCP把这个文件复制到了你的Unix系统上。
  4. WinSCP认为:“这个文件里有一些不是普通文本的东西;我给它加个.bin后缀,表示这是二进制数据。”
  5. 缺少的__init__.py(现在叫__init__.py.bin)导致Python无法把工具包识别为一个包。
  6. 你在合适的目录下创建了__init__.py,然后一切都正常了...?

撰写回答