如何解决Python中的“ ImportError:没有名为…的模块”错误?


114

解决此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外壳程序执行此操作,那么它将起作用:

python
>>> from foo.tasks import my_function

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

Answers:


119

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


9
那么在根文件夹中使用init .py 有什么意义呢?如果您编辑sys.path或pythonpath,这似乎毫无用处。

11
@Editor:__init__.py仅当目录的父目录位于目录包中sys.path或目录包本身时,才应将目录视为文件包。
伊格纳西奥·巴斯克斯

3
另外,检查文件夹上的权限。就我而言,这就是问题所在。
SidJ

15
要将当前目录添加到python路径,请使用export PYTHONPATH=`pwd`
rodorgas

1
对我有用的是将$ PYTHONPATH添加到项目的父目录,您的情况将是:/home/bodacydo/work... 查看此答案
maledr53

33

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

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


谢谢,是的,我有__init__.py。这次的问题是$PYTHONPATH。伊格纳西奥的解决方案奏效。
bodacydo

1
要使Python将目录视为包含包,必须使用init .py文件。这样做是为了防止具有通用名称(例如字符串)的目录无意间隐藏了稍后在模块搜索路径中出现的有效模块。在最简单的情况下,init .py只能是一个空文件
panofish

感谢您为我节省时间。
cpu_meltdown

9

以下是分步解决方案:

  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

说明:由于python将PYTHONPATH附加到其运行脚本的路径,因此 running run.py将附加/home/bodacydo/work/project。和voilàimport foo.tasks将被发现。


8

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

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

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

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

6

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

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

我有一个快速的书面记录这个问题,其他的应答者提到的原因,因为这是python path/to/file.py看跌期权path/to上的开始PYTHONPATHsys.path)。


2

在我看来,我必须考虑该foo文件夹是一个独立的库。我可能要考虑将其移动到Lib\site-packagespython安装中的文件夹中。我可能要考虑在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


0

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

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.