python“;没有名为“的模块”;调用子模块时出错
我在import语句中遇到了问题,因为Python报告没有名为_页面或_生成器的模块 task_a.py包含导入生成器。页面作为页面,当作为主脚本运行时,不会导致任何问题 py包含python“;没有名为“的模块”;调用子模块时出错,python,python-2.7,Python,Python 2.7,我在import语句中遇到了问题,因为Python报告没有名为_页面或_生成器的模块 task_a.py包含导入生成器。页面作为页面,当作为主脚本运行时,不会导致任何问题 py包含导入任务.task\u a,但当我将其作为主脚本运行时,python抛出以下错误 Traceback (most recent call last): File "/generator/the_generator.py", line 7, in <module> import tasks.tas
导入任务.task\u 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
作为包结束,因此绝对导入generator。页面
,或相对导入,会很好的。但是,当您只运行脚本生成器/the_generator.py
时,没有生成器。the_generator
,只运行\uuu main\uuu
,并且没有生成器
包。Python知道如何找到生成器的唯一其他方法是,如果生成器的父目录位于sys.path
,而不是sys.path,则会出现页面
正如您所猜测的,您可以通过mungsys.path
将适当的父目录放在那里来解决这个问题……但这也是一个坏主意
这个解决方案还有许多其他问题。最严重的是,它很容易导致同一个模块被导入两次(因为Python无法知道两个显然不相关的名称碰巧引用了同一个模块)。它也很难部署(如果脚本取决于是否在包中,则无法将其安装到/usr/local/bin
),如果包中的.zip或.egg文件用完,则无法使用
有两种标准方法可以解决这个问题
首先,将脚本作为模块而不是脚本运行。从generator
的父目录中,只需python-m generator.the_generator
而不是python generator/the_generator.py
这样做的一个主要优点是,当generator
位于站点包的某个位置时,它在正常安装的部署中也能正常工作,就像在测试中一样
或者,创建一个位于生成器旁边的脚本,并运行该脚本,而不是其中的模块。这与将所有如果
生成器.py中的
代码
移动到函数中,然后写入两行包装器一样简单:
import generator.the_generator
generator.the_generator.main()
同样,这在正常安装的部署中也同样有效。另外,这意味着脚本可以安装到您的bin
目录中,使事情变得更加简单,就像pip
或ipython
您不应该尝试从包的中间运行脚本作为顶级脚本。常见问题解答解释了原因,但基本上,主要问题是:您将导入与包的其余部分混淆。(还有一个事实是,同一个模块可能会被导入两次,因为Python无法分辨这两个不同的名称是指同一个模块的。)我认为他们已经解决了很多问题,尽管您必须显式地设置\uuuuuu package\uuuuu
。@user2357112:不,确实没有。如果顶级包已经是绝对可导入的,则设置\uuuuuuuuuuuuuuuuu
也将使相对导入工作。(在讨论PEP 366时,明确决定不做任何事情来简化伪造绝对导入的过程,因为这通常是一个坏主意,而您需要做的任何事情都应该是明确且明显的黑客行为。)将脚本作为模块运行就像一个魅力<代码>python-m生成器。_生成器
import generator.the_generator
generator.the_generator.main()