我想组织我的python项目:
/proj
/test
__init__.py
test.py
/utils
__init__.py
util.py
内部test.py
我想要从utils.util
from utils.util import classA
但是,当我在test.py
目录中运行/proj
时出现错误:
$ python test/test.py
Traceback (most recent call last):
File "test/test.py", line 1, in <module>
from utils.util import classA
ImportError: No module named utils.util
但是,如果我进行了这些更改,代码运行正常(python test.py
)
/proj
test.py
/utils
__init__.py
util.py
我真的希望像第一个例子那样组织我的代码而不会出错。我怎样才能让自己这样做?
答案 0 :(得分:2)
您可以将其作为包运行。
python -m test.test
答案 1 :(得分:2)
导入工作原理
当您尝试导入模块时,Python会搜索PYTHONPATH中的目录,查找您要导入的模块。
因此,当您编写from utils.util import classA
时,它会查找名为utils
的目录,其中包含文件util.py
(和__init__.py
,但这是一个不同的问题)。目录utils
必须在您的PYTHONPATH上。
您的案例会发生什么
如果你把它放在脚本中,你可以看到路径上的内容:
import sys
print sys.path
当你打印它时,你可能会看到它连接一个空字符串''
。这意味着您的脚本(test.py
)所在的目录。因此,如果utils
direcory位于test.py
所在的位置,Python将能够找到它。否则它不会。
如何修复
确保utils
在路径上。有不同的方法可以做到这一点,例如
PYTHONPATH
python test.py
环境变量中
sys.path
内的根目录添加到test.py
编辑:或者,正如Sayan写道:
python -m test.test
运行(从根目录执行)答案 2 :(得分:0)
您可以执行模块相对导入。尝试:
from ..utils.util import classA
在test.py