接收导入错误:没有名为***的模块,但有__init__.py

时间:2013-05-10 11:07:09

标签: python python-3.x importerror

据我所知,这个问题已被多次询问,但在阅读完这些问题并提出建议修正后,我仍然感到难过。

我的项目结构如下:

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个模块都是空的。

非常感谢你的帮助。

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:12)

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

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

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

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

答案 2 :(得分:1)

如果有人来到这里:

我也遇到了这个错误。在我的情况下,我在~/my/path/处使用了path.sys.append(...),修复程序正在使用显式路径名替换~(如果您输入pwd,则可以查询它在linux shell上,或使用os.path.expanduser(..)

答案 3 :(得分:0)

另一种无需路径即可解决此问题的方法如下:考虑以下代码,其中在文件夹名称“ 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

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

$ 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

答案 4 :(得分:0)

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

export PYTHONPATH="${PYTHONPATH}:."