20

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

我的项目结构如下:

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 All __init__.pymodules are fully empty。

我们将不胜感激地获得帮助。

4

5 回答 5

23

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

import sys
sys.path.append("/Project/src/")
import root
import root.nested.tests
于 2013-05-10T11:16:52.840 回答
18

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

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

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

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

于 2014-05-27T14:05:27.833 回答
1

如果有人降落在这里:

我也遇到了这个错误。在我的情况下,我使用~/my/path/at path.sys.append(...),并且修复被替换为显式路径名(如果您在 linux shell 上~键入,则可以查询它,或者使用)pwdos.path.expanduser(..)

于 2015-11-03T02:07:39.373 回答
1

另一种在没有路径的情况下解决此问题的方法如下:考虑以下代码,在您的文件夹名称“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
于 2019-05-16T17:36:09.527 回答
0

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

export PYTHONPATH="${PYTHONPATH}:."
于 2021-08-05T15:54:45.560 回答