如何解决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/projectsys.path$PYTHONPATH

你在foo目录下有一个名为__init__.py的文件吗? 如果没有,那么python将不会将foo识别为python包。

有关更多信息,请参阅python教程中有关软件包的部分 。

这是一个循序渐进的解决scheme:

  1. /home/bodacydo/work/project添加一个名为run.py的脚本,并像这样编辑它:

     import programs.my_python_program programs.my_python_program.main() 

    (用my_python_program的等价方法replacemain() 。)

  2. 转到/home/bodacydo/work/project
  3. 运行run.py

说明:由于python追加到PYTHONPATH 脚本的运行path,运行run.py会追加/home/bodacydo/work/projectimport foo.tasksimport foo.tasks将被发现。

将库添加到您的PYTHONPATH的示例解决scheme。

  1. 将以下行添加到〜/ .bashrc中,或直接运行:

     export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
  2. 然后将你需要的库链接到你的〜/ .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.pypath/to放在PYTHONPATHsys.path )的开头。