关于python:在包中运行模块没有模块错误

running module within a package getting no module error

本问题已经有最佳答案,请猛点这里访问。

我想这样组织我的python项目:

1
2
3
4
5
6
7
/proj
   /test
      __init__.py
      test.py
   /utils
      __init__.py
      util.py

test.py中,我想从utils.util导入一个类。

from utils.util import classA

但是,当我在/proj目录中运行test.py时,会得到一个错误:

1
2
3
4
5
$ 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)

1
2
3
4
5
/proj
   test.py
   /utils
      __init__.py
      util.py

我真的希望能够像第一个示例那样组织代码而不出错。我怎样才能做到这一点?


导入工作原理

当您尝试导入模块时,python会在pythonpath中的目录中搜索,以查找您要导入的模块。

因此,在编写from utils.util import classA时,它会查找名为utils的目录,其中包含文件util.py__init__.py但这是另一个问题。目录utils必须在您的路径上。

你的案子怎么了

如果将其放入脚本中,可以看到路径上的内容:

1
2
import sys
print sys.path

打印时,您可能会看到它包含一个空字符串''。这意味着脚本(test.py所在的目录。因此,如果utils目录与test.py所在的位置相同,python就可以找到它。否则就不会了。

如何修复

确保utils在路径上。有不同的方法可以做到这一点,例如

  • 将您的入口脚本放在根目录中(如您的示例中所用);或者
  • 在运行python test.py之前,将根目录添加到PYTHONPATH环境变量中。
  • 在导入任何内容之前,将根目录从test.py中添加到sys.path

编辑:或者,如Sayan所写:

  • python -m test.test的形式运行(从根目录运行)

您可以将其作为包运行。

1
python -m test.test


可以执行模块相关导入。尝试:

1
from ..utils.util import classA

在你的test.py