据我所知,这个问题已被多次询问,但在阅读完这些问题并提出建议修正后,我仍然感到难过。
我的项目结构如下:
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
个模块都是空的。
非常感谢你的帮助。
答案 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}:."