【问题标题】:Receiving Import Error: No Module named ***, but has __init__.py接收导入错误:没有名为 *** 的模块,但有 __init__.py
【发布时间】:2013-05-05 01:23:08
【问题描述】:

我知道这个问题已经被问过好几次了,但是在阅读了它们并做出了建议的修复之后,我仍然感到困惑。

我的项目结构如下:

Project
      |
      src
        |
         root - has __init__.py
            |
            nested - has __init__.py
                  |
                  tests - has __init__.py
                  |
                  utilities - has __init__.py
                  |
                  services - has __init__.py

我已经成功地从 Eclipse 运行了一个单元测试回归类,没有任何问题。

当我尝试从命令行运行相同的类时(因为将运行该套件的其他用户无权访问 Eclipse)我收到错误:

ImportError: No module named 'root'

从上面可以看到,模块根有一个__init__.py 所有__init__.py 模块都是空的。

我们将不胜感激。

【问题讨论】:

  • src 在您的sys.path 上吗?您是在该目录中运行 Python 命令还是将 src 显式添加到您的 sys.path(或 PYTHONPATH 环境变量)?
  • @Martijin:我正在尝试从“..\tests 目录”中执行。 'scr' 未添加到 'sys.path' 或 'PYTHONPATH'。我不知道它需要,这是第一次尝试通过命令行执行。我会尝试将目录添加到“PYTHONPATH”
  • 我不建议添加到路径。我建议你学习看看如何设置setup.py,这意味着实际创建一个 Python 项目。从长远来看,这对您有帮助。
  • @MartijnPieters:谢谢,我已经添加了sys.path,现在一切都很好。我对你的评论投了赞成票。 @CppLearner:现在阅读。非常有用,也给你投票,谢谢。

标签: python python-3.x importerror


【解决方案1】:

尝试将sys.path.append 添加到您的导入列表中。

import sys
sys.path.append("/Project/src/")
import root
import root.nested.tests

【讨论】:

  • 谢谢,正是需要的。
  • 我在尝试这个时收到NameError: name 'sys' is not defined
  • @CGFoX 您需要先导入 sys,修改答案以反映这一点
【解决方案2】:

对于遇到此问题的任何人,使用 Gus E 在接受答案中显示的内容和一些进一步的经验,我发现以下内容对于确保我可以从命令行运行我的程序非常有用如果需要,可以在我的机器上或其他同事的机器上。

import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))

当我执行位于“nested”目录中的“main”方法时,它确保在执行时将“src”目录添加到 PYTHONPATH,这意味着所有后续导入都不会引发错误。

显然,您需要调整 os.path.join() 方法的“..”参数数量,具体取决于程序中 main 方法的执行位置

【讨论】:

  • 这为我省去了很多痛苦。谢谢!
  • 如果这不起作用,请尝试 prepending 到 sys.path:sys.path = [os.path.join(os.path.dirname(__file__), "..", "..")] + sys.path,然后它可能会起作用。我不确定这是否是由于我的项目文件夹是我的 Windows 10 桌面文件夹中的一个文件夹。
【解决方案3】:

如果有人降落在这里:

我也遇到了这个错误。在我的例子中,我在path.sys.append(...) 中使用了~/my/path/,修复方法是将~ 替换为显式路径名(如果您在Linux shell 上键入pwd,可以查询它,或者使用@987654325 @)

【讨论】:

    【解决方案4】:

    另一种无需路径即可解决此问题的方法如下:考虑以下代码,在您的文件夹名称“app”中,您有 3 个文件 x.py、y.py 和一个空的 init .py。因此,要运行 x.py,您需要从 y 导入:

    x.py

    from app.y import say_hi
    print ("ok x is here")
    say_hi()
    

    还有

    y.py

    print ("Im Y")
    def say_hi():
        print ("Y says hi")
    

    所以文件夹结构如下所示:

    testpy
           app
               __init__.py
               x.py
               y.py
    

    解决方案:在文件夹 BEFORE 应用程序中执行以下操作:

    $ python -m app.x
    

    注意:我没有使用x.py(只是app.x)

    结果:

    Nespresso@adhg MINGW64 ~/Desktop/testpy
    $ python -m app.x
    Im Y
    ok x is here
    Y says hi
    

    【讨论】:

      【解决方案5】:

      让python在当前目录中搜索模块的另一种方法是将其作为环境变量添加到您的 .bash_profile / .zshrc / 等中,如下所示:

      export PYTHONPATH="${PYTHONPATH}:."
      

      【讨论】:

        猜你喜欢
        • 2015-01-20
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多