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

bod*_*ydo 105 python

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

我有以下目录结构:

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
Run Code Online (Sandbox Code Playgroud)

我在目录中

/home/bodacydo/work/project
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入

python ./programs/my_python_program.py
Run Code Online (Sandbox Code Playgroud)

我立即得到了

ImportError: No module named foo.tasks
Run Code Online (Sandbox Code Playgroud)

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

from foo.tasks import my_function
Run Code Online (Sandbox Code Playgroud)

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

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

python
>>> from foo.tasks import my_function
Run Code Online (Sandbox Code Playgroud)

如果我通过python ./programs/my_python_program.py脚本调用它,它只能起作用.

Ign*_*ams 106

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

  • 要将当前dir添加到python路径,请使用`export PYTHONPATH = \`pwd \`` (12认同)
  • @Editor:`__init __.py`仅表示该目录应该被视为一个包,当它的父目录在`sys.path`中或者它本身就是一个包时. (9认同)
  • 那么在根文件夹中有__init__.py的重点是什么?如果编辑sys.path或pythonpath,似乎没有用处. (6认同)
  • 另外,检查文件夹的权限.这就是我的问题. (3认同)
  • 对我有用的是将项目的父目录添加到 $PYTHONPATH,在你的情况下将是:`/home/bodacydo/work` ... [见这个答案](https://stackoverflow.com/a/ 714070/3404438) (2认同)

Dav*_*rby 31

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

有关更多信息,请参阅python教程中有关包部分.

  • 需要 __init__.py 文件才能使 Python 将目录视为包含包;这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏稍后出现在模块搜索路径上的有效模块。在最简单的情况下,__init__.py 可以只是一个空文件 (2认同)

Ant*_*ile 9

一个更好的比设定的修复PYTHONPATH方法是使用python -m module.path

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

我有一个关于这个问题的快速文章,因为其他回答者已经提到了这个问题的原因python path/to/file.py放在( )path/to的开头。PYTHONPATHsys.path


cyb*_*org 8

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

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

    import programs.my_python_program
    programs.my_python_program.main()
    
    Run Code Online (Sandbox Code Playgroud)

    (替换main()为您的等效方法my_python_program.)

  2. /home/bodacydo/work/project
  3. run.py

说明:由于python将运行它的脚本的路径追加到PYTHONPATH ,因此run.py将追加运行/home/bodacydo/work/project.而且,import foo.tasks会被发现.


ken*_*orb 7

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

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

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

    ln -s /home/user/work/project/foo ~/.python/
    
    Run Code Online (Sandbox Code Playgroud)