如何在 Python 中修复“ Import Error: No module name...”错误?

修复这个重要错误的正确方法是什么?

我有以下目录结构:

/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

我不明白为什么巨蟒找不到 ./foo/tasks.py-它在那里。

如果我在 Python shell 中执行,那么它就可以工作:

python
>>> from foo.tasks import my_function

它只有在我通过 python ./programs/my_python_program.py脚本调用它时才不工作。

582297 次浏览

Python 不会将工作目录添加到 sys.path,而是添加脚本所在的目录。将 /home/bodacydo/work/project添加到 sys.path$PYTHONPATH

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

有关更多信息,请参见 python 教程中的 关于包装的章节

我认为 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./program/my _ python _ program. py

以下是一个循序渐进的解决方案:

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

    import programs.my_python_program
    programs.my_python_program.main()
    

    (用 my_python_program中的等效方法替换 main()。)

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

说明: 因为 python 将 运行它的脚本的路径附加到 PYTHONPATH,所以运行 run.py将附加到 /home/bodacydo/work/project

向 PYTHONPATH 添加库的示例解决方案。

  1. 在 ~/. bashrc 中添加以下代码行,或者直接运行它:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
    
  2. Then link your required library into your ~/.python folder, e.g.

    ln -s /home/user/work/project/foo ~/.python/
    

比设置 PYTHONPATH更好的 好多了修正方法是使用 python -m module.path

这将正确设置 sys.path[0],并且是执行模块的更可靠的方法。

我有一个关于这个问题的 快速记录,因为其他的答案已经提到了 原因,因为这是 python path/to/file.pypath/to放在 PYTHONPATH(sys.path)的开头。

如果在使用已安装版本时出现此问题,请确保在使用 setup.py时将模块包含在 packages

setup(name='Your program',
version='0.7.0',
description='Your desccription',
packages=['foo', 'foo.bar'], # add `foo.bar` here