【问题标题】:How to fix "ImportError: No module named ..." error in Python?如何修复 Python 中的“ImportError: No module named ...”错误?
【发布时间】:2011-01-20 12:30:15
【问题描述】:

修复此 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


    【解决方案1】:

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

    【讨论】:

    • 那么在根文件夹中有 init.py 有什么意义呢?如果您编辑 sys.path 或 pythonpath,这似乎没有任何意义。
    • @Editor: __init__.py 仅表示该目录应被视为一个包,当其父目录位于sys.path 或本身就是一个包时。
    • 另外检查文件夹的权限。这就是我的问题。
    • 要将当前目录添加到python路径,请使用export PYTHONPATH=`pwd`
    • 对我有用的是将项目的父目录添加到 $PYTHONPATH 中,在您的情况下将是:/home/bodacydo/work ... see this answer
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,是的,我有__init__.py。这次的问题是$PYTHONPATH。 Ignacio 的解决方案奏效了。
    • init.py 文件是 Python 将目录视为包含包所必需的;这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏模块搜索路径中稍后出现的有效模块。在最简单的情况下,init.py 可以只是一个空文件
    • 感谢您为我节省了时间。
    【解决方案3】:

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

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

    我有一个关于这个问题的quick writeup,因为其他回答者提到了原因,因为这是python path/to/file.pypath/to 放在PYTHONPATH 的开头(sys.path) .

    【讨论】:

      【解决方案4】:

      这里是一步一步的解决方案:

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

        import programs.my_python_program
        programs.my_python_program.main()
        

        (将main()替换为my_python_program中的等效方法。)

      2. 转到/home/bodacydo/work/project
      3. 运行run.py

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-02-27
              • 2015-04-30
              • 2015-09-10
              • 2012-11-22
              • 1970-01-01
              • 2011-04-08
              • 2016-08-09
              相关资源
              最近更新 更多