如何在Python中修复“ImportError:No module named …”错误?

How to fix “ImportError: No module named …” error in Python?

修复此importError错误的正确方法是什么?

我有以下目录结构:

1
2
3
4
5
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo

我在目录里

1
/home/bodacydo/work/project

现在如果我打字

1
python ./programs/my_python_program.py

我立刻得到

1
ImportError: No module named foo.tasks

./programs/my_python_program.py包含以下行:

1
from foo.tasks import my_function

我不明白为什么python找不到./foo/tasks.py——它就在那里。

如果我从python shell执行此操作,那么它会工作:

1
2
python
>>> from foo.tasks import my_function

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


python不会将当前目录添加到sys.path中,而是添加脚本所在的目录。将/home/bodacydo/work/project加到sys.path$PYTHONPATH中。


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

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


将库添加到您的pythonpath的示例解决方案。

  • 在~/.bashrc中添加以下行或直接运行它:

    1
    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  • 然后将所需的库链接到~/.python文件夹中,例如

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

  • 下面是一个逐步解决方案:

  • /home/bodacydo/work/project中添加一个名为run.py的脚本,然后按如下方式编辑:


    1
    2
    import programs.my_python_program
    programs.my_python_program.main()

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

  • /home/bodacydo/work/project
  • 运行run.py
  • 说明:由于python将运行脚本的路径追加到pythonpath,因此运行run.py将追加/home/bodacydo/work/project。好的,会找到import foo.tasks


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

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

    关于这个问题,我有一个简短的描述,正如其他回答者所提到的,原因是python path/to/file.pypath/to放在PYTHONPATH的开头(sys.path)。


    在我看来,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