在包中运行模块没有模块错误

时间:2015-11-30 20:54:44

标签: python

我想组织我的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

我真的希望像第一个例子那样组织我的代码而不会出错。我怎样才能让自己这样做?

3 个答案:

答案 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