修复此ImportError错误的正确方法是什么?
我有以下目录结构:
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
我在目录
/home/bodacydo/work/project
现在如果我输入
python ./programs/my_python_program.py
我立即获得
ImportError: No module named foo.tasks
./programs/my_python_program.py
包含以下行:
from foo.tasks import my_function
我无法理解为什么python找不到./foo/tasks.py
- 它就在那里。
如果我从Python shell中执行此操作,那么它可以工作:
python
>>> from foo.tasks import my_function
只有通过python ./programs/my_python_program.py
脚本调用它才能起作用。
答案 0 :(得分:103)
Python不会将当前目录添加到sys.path
,而是添加脚本所在的目录。将/home/bodacydo/work/project
添加到sys.path
或$PYTHONPATH
。
答案 1 :(得分:31)
你在foo目录中有一个名为__init__.py
的文件吗?如果没有,则python不会将foo识别为python包。
有关详细信息,请参阅python教程中的section on packages。
答案 2 :(得分:7)
这是一个循序渐进的解决方案:
在run.py
中添加名为/home/bodacydo/work/project
的脚本,并按照以下方式进行编辑:
import programs.my_python_program programs.my_python_program.main()
(使用main()
中的等效方法替换my_python_program
。)
/home/bodacydo/work/project
run.py
说明:
由于python将运行它的脚本的路径附加到PYTHONPATH ,因此运行run.py
将追加/home/bodacydo/work/project
。 voilà,import foo.tasks
将被找到。
答案 3 :(得分:6)
将库添加到PYTHONPATH的示例解决方案。
将以下行添加到〜/ .bashrc中或直接运行:
export PYTHONPATH="$PYTHONPATH:$HOME/.python"
然后将您所需的库链接到〜/ .python文件夹,例如
ln -s /home/user/work/project/foo ~/.python/
答案 4 :(得分:2)
在我看来,我必须考虑foo
文件夹是一个独立的库。我可能想考虑将它移动到python安装中的Lib\site-packages
文件夹。我可能想考虑在那里添加foo.pth
文件。
我知道它是一个库,因为./programs/my_python_program.py
包含以下行:
from foo.tasks import my_function
因此./programs
是./foo
的兄弟文件夹并不重要。这是my_python_program.py
像这样的脚本运行的事实:
python ./programs/my_python_program.py
答案 5 :(得分:2)
更好修复,而不是设置PYTHONPATH
,是使用python -m module.path
这将正确设置sys.path[0]
,是一种更可靠的执行模块的方法。
关于此问题我有一个quick writeup,因为其他回答者已经提到原因,python path/to/file.py
将path/to
置于PYTHONPATH
的开头1}}(sys.path
)。
答案 6 :(得分:0)
如果在使用安装版本时遇到此问题,在使用setup.py
时,请确保您的模块包含在packages
内
setup(name='Your program',
version='0.7.0',
description='Your desccription',
packages=['foo', 'foo.bar'], # add `foo.bar` here