gpt4 book ai didi

调用子模块时python "No module named"错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:56 27 4
gpt4 key购买 nike

我在使用 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__,也没有生成器包。 Python 知道如何找到 generator.the_page 的唯一其他方法是,如果 generator 的父目录位于 sys.path 上,它不是。

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

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


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

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

这样做的一个主要优点是,当 generator 在站点包中某处时,它在正常安装的部署中工作得和在测试中一样好。

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

import generator.the_generator
generator.the_generator.main()

同样,这在正常安装的部署中同样有效。另外,这意味着脚本可以安装到您的 bin 目录中,使事情变得更加简单,就像 pipipython 一样。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com