在包中运行模块没有模块错误[重复]

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 运行它(从根目录执行)

【讨论】:

以上是关于在包中运行模块没有模块错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在包中并行执行程序[重复]

具有相同名称的 Python 模块(即,在包中重用标准模块名称)

在 Python 中,是不是可以在包级别从子包中公开模块?

swift包管理器中的“警告:没有要在包中构建的目标”错误

导入错误:没有名为“Tkinter”的模块 [重复]

django中的“没有模块名称mysqldb”错误[重复]