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

时间:2010-02-24 12:31:09

标签: python

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

我有以下目录结构:

/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

我无法理解为什么python找不到./foo/tasks.py - 它就在那里。

如果我从Python shell中执行此操作,那么它可以工作:

python
>>> from foo.tasks import my_function

只有通过python ./programs/my_python_program.py脚本调用它才能起作用。

7 个答案:

答案 0 :(得分:103)

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

答案 1 :(得分:31)

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

有关详细信息,请参阅python教程中的section on packages

答案 2 :(得分:7)

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

  1. run.py中添加名为/home/bodacydo/work/project的脚本,并按照以下方式进行编辑:

    import programs.my_python_program
    programs.my_python_program.main()
    

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

  2. 转到/home/bodacydo/work/project
  3. 运行run.py
  4. 说明: 由于python将运行它的脚本的路径附加到PYTHONPATH ,因此运行run.py将追加/home/bodacydo/work/projectvoilàimport foo.tasks将被找到。

答案 3 :(得分:6)

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

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

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
    
  2. 然后将您所需的库链接到〜/ .python文件夹,例如

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

答案 4 :(得分:2)

在我看来,我必须考虑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

答案 5 :(得分:2)

更好修复,而不是设置PYTHONPATH,是使用python -m module.path

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

关于此问题我有一个quick writeup,因为其他回答者已经提到原因python path/to/file.pypath/to置于PYTHONPATH的开头1}}(sys.path)。

答案 6 :(得分:0)

如果在使用安装版本时遇到此问题,在使用setup.py时,请确保您的模块包含在packages

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