繁体   English   中英

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

[英]How to fix “ImportError: No module named …” error in 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脚本调用它时它才不起作用。

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

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

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

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

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

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

这是一个分步解决方案:

  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 import foo.tasks会被发现。

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

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

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

    ln -s /home/user/work/project/foo ~/.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是作为这样的脚本运行的:

蟒蛇./programs/my_python_program.py

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM