我在使用 import 语句时遇到问题,因为 Python 报告说没有名为 the_page 或 the_generator 的模块。

task_a.py 包含 import generator.the_page as ThePage ,当作为主脚本运行时,没有问题。

the_generator.py 包含 import tasks.task_a ,但是当我将它作为主脚本运行时,python 抛出以下错误..

Traceback (most recent call last):
  File "/generator/the_generator.py", line 7, in <module>
    import tasks.tasks_a
  File "/generator/tasks/tasks_a.py", line 3, in <module>
    import generator.the_page as ThePage
ImportError: No module named the_page

这是结构。
generator/
    __init__.py
    the_generator.py
    the_page.py
    tasks/
        __init__.py
        task_a.py

也许你可以帮助我的问题家伙。感谢所有的帮助!

最佳答案

从包中间运行脚本是一个坏主意,出于多种原因,其中最明显的是您遇到的那个:当您在某处 import generator.the_generator 时,generator 最终成为一个包,因此绝对导入generator.the_page 或相对导入,将正常工作。但是当你只运行脚本 generator/the_generator.py 时,没有 generator.the_generator ,只有 __main__ ,也没有 generator 包。 Python 可以知道如何找到 generator.the_page 的唯一另一种方式是 generator 的父目录是否在 sys.path 上,但事实并非如此。

您可以猜到,您可以通过调整 sys.path 将适当的父目录放在那里来解决这个问题……但这也是一个坏主意。

该解决方案还存在许多其他问题。最严重的是,它很容易导致同一个模块被导入两次(因为 Python 无法知道两个明显不相关的名称碰巧引用了同一个模块)。它也很难部署(如果 /usr/local/bin 依赖于包内部,则无法将脚本安装到 generator 中……),如果您的包用完 .zip 或 .egg 等,它将无法工作。

有两种标准方法可以解决这个问题。

首先,将脚本作为模块而不是脚本运行。从 python -m generator.the_generator 的父目录,只是 python generator/the_generator.py 而不是 generator

这样做的一个主要优点是它在正常安装的部署中也能正常工作,当 generator 位于某个地方的站点包中时,就像在测试中一样。

或者,创建一个位于 if __name__ == '__main__': 旁边的脚本,然后运行它,而不是其中的模块。这就像将 the_generator.py 中的所有 bin 代码移动到一个函数中,然后编写两行包装器一样简单:

import generator.the_generator
generator.the_generator.main()

同样,这在正常安装的部署中也能正常工作。另外,这意味着脚本可以安装到您的 pip 目录中,让事情变得更加简单,就像 ipython 或 ojit_code 一样。

关于调用子模块时出现python "No module named"错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18496183/

10-11 19:45