如何解决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
)的开头。