Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python“;没有名为“的模块”;调用子模块时出错_Python_Python 2.7 - Fatal编程技术网

python“;没有名为“的模块”;调用子模块时出错

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

我在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.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,则会出现
页面

正如您所猜测的,您可以通过mung
sys.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()