在包中运行模块没有模块错误[重复]
Posted
技术标签:
【中文标题】在包中运行模块没有模块错误[重复]【英文标题】:running module within a package getting no module error [duplicate] 【发布时间】:2016-03-04 15:11:55 【问题描述】:我想像这样组织我的 python 项目:
/proj
/test
__init__.py
test.py
/utils
__init__.py
util.py
在test.py
里面我想从utils.util
导入一个类
from utils.util import classA
但是,当我在 /proj
目录中运行 test.py
时出现错误:
$ 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
我真的希望能够像在第一个示例中那样组织我的代码而不会出错。我怎样才能让自己做到这一点?
【问题讨论】:
【参考方案1】:您可以进行模块相对导入。试试:
from ..utils.util import classA
在你的test.py
【讨论】:
【参考方案2】:您可以将它作为一个包运行。
python -m test.test
【讨论】:
【参考方案3】:导入的工作原理
当您尝试导入模块时,Python 会搜索 PYTHONPATH 中的目录,寻找您要导入的模块。
因此,当您编写from utils.util import classA
时,它会查找名为utils
的目录,其中包含文件util.py
(和__init__.py
,但这是一个不同的问题)。目录 utils
必须在您的 PYTHONPATH 上。
你的情况会发生什么
如果将其放入脚本中,您可以看到路径上的内容:
import sys
print sys.path
当您打印它时,您可能会看到它包含一个空字符串''
。这意味着您的脚本 (test.py
) 所在的目录。因此,如果utils
目录与test.py
所在的位置相同,Python 将能够找到它。否则不会。
如何解决
确保utils
在路径上。有不同的方法可以做到这一点,例如
python test.py
之前将根目录添加到PYTHONPATH
环境变量中
在导入任何内容之前,将根目录从test.py
中添加到sys.path
编辑:或者,正如萨扬所说:
以python -m test.test
运行它(从根目录执行)
【讨论】:
以上是关于在包中运行模块没有模块错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章