如何解决Python中的“ImportError:No module named …”错误?
什么是解决这个ImportError错误的正确方法?
我有以下目录结构:
/home/bodacydo /home/bodacydo/work /home/bodacydo/work/project /home/bodacydo/work/project/programs /home/bodacydo/work/project/foo
我在目录中
/home/bodacydo/work/project
现在,如果我input
python ./programs/my_python_program.py
我立即得到
ImportError: No module named foo.tasks
./programs/my_python_program.py包含以下行:
from foo.tasks import my_function
我不明白为什么Python不会find./foo/tasks.py – 它在那里。
如果我从Python shell中执行它,那么它可以工作:
python >>> from foo.tasks import my_function
如果我通过python ./programs/my_python_program.py脚本调用它,它将python ./programs/my_python_program.py 。
Python不会将当前目录添加到sys.path ,而是将脚本所在的目录添加到/home/bodacydo/work/project到sys.path或$PYTHONPATH 。
你在foo目录下有一个名为__init__.py的文件吗? 如果没有,那么python将不会将foo识别为python包。
有关更多信息,请参阅python教程中有关软件包的部分 。
这是一个循序渐进的解决scheme:
-
在
/home/bodacydo/work/project添加一个名为run.py的脚本,并像这样编辑它:import programs.my_python_program programs.my_python_program.main()(用
my_python_program的等价方法replacemain()。) - 转到
/home/bodacydo/work/project - 运行
run.py
说明:由于python追加到PYTHONPATH 脚本的运行path,运行run.py会追加/home/bodacydo/work/project 。 import foo.tasks , import foo.tasks将被发现。
将库添加到您的PYTHONPATH的示例解决scheme。
-
将以下行添加到〜/ .bashrc中,或直接运行:
export PYTHONPATH="$PYTHONPATH:$HOME/.python" -
然后将你需要的库链接到你的〜/ .python文件夹,例如
ln -s /home/user/work/project/foo ~/.python/
在我看来,我不得不考虑foo文件夹是一个独立的库。 我可能要考虑把它移动到python安装中的Lib\site-packages文件夹。 我可能要考虑在那里添加一个foo.pth文件。
我知道这是一个库,因为./programs/my_python_program.py包含以下行:
from foo.tasks import my_function
所以没关系./programs是./programs的兄弟文件夹。 这是my_python_program.py作为脚本运行的事实:
python ./programs/my_python_program.py
比设置PYTHONPATH 更好的解决方法是使用python -m module.path
这将正确设置sys.path[0]并且是执行模块更可靠的方法。
我有一个关于这个问题的快速写作 ,因为其他答案已经提到了这个的原因是python path/to/file.py把path/to放在PYTHONPATH ( sys.path )的开头。