Python错误 "ImportError: 没有名为的模块
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 个回答
我在做LPTHW的练习时遇到过类似的问题;我一直无法让Python识别我在调用的目录里有文件。不过最后我还是搞定了。我的做法,以及我推荐的做法是这样的:
(注意:根据你最初的帖子,我假设你是在一个基于*NIX的机器上,并且是通过命令行来运行的,所以这些建议是针对这种情况的。因为我使用的是Ubuntu,所以我做了以下操作)
首先,使用命令行切换到你文件所在目录的上一级目录。比如说,你想运行
mountain.py
文件,并且要调用toolkit.interface.py
模块,这两个文件在不同的目录里。在这种情况下,你需要进入一个包含这两个文件路径的目录(换句话说,就是这两个文件路径最近的共同目录)。在这个例子中,就是toolkit
目录。当你在
toolkit
目录时,在命令行输入这一行代码:export PYTHONPATH=.
这条命令是把你的PYTHONPATH设置为“.”,这基本上意味着你的PYTHONPATH现在会在你当前所在的目录里寻找任何被调用的文件(更准确地说,是在你当前目录的子目录中寻找)。所以它不仅仅会在你当前的目录里查找,还会在所有位于你当前目录下的目录中查找。
在你设置好PYTHONPATH之后,从你当前的目录(即
toolkit
目录)运行你的模块。Python现在应该能够找到并加载你指定的模块。
根据你对orip帖子里的评论,我猜事情是这样的:
- 你在Windows上编辑了
__init__.py
文件。 - Windows的编辑器可能添加了一些看不见的字符,比如换行符(在Windows中,换行是CR/LF;而在Unix中,只有LF),或者可能是CTRL-Z(表示文件结束)。
- 你用WinSCP把这个文件复制到了你的Unix系统上。
- WinSCP认为:“这个文件里有一些不是普通文本的东西;我给它加个.bin后缀,表示这是二进制数据。”
- 缺少的
__init__.py
(现在叫__init__.py.bin
)导致Python无法把工具包识别为一个包。 - 你在合适的目录下创建了
__init__.py
,然后一切都正常了...?