![](/img/trans.png)
[英]Make python3 subpackage module available for import in main package namespace
[英]Python Import Statement and Recursion- need function available in module namespace
我在main.py中有函数foo()。 在main.py中,我导入create.py。 但是create.py中有一个函数需要来自main的foo()。 我无法将main.py导入到create.py中,因为main.py出错...我认为这是某种竞争条件。
如何在create.py命名空间中使foo()可用? 将foo()作为模块并由main.py和create.py导入仅用于一个函数似乎效率低下。
简单的答案是将foo()移动到foo.py并从那里导入或将其移动到create.py并将其从那里导入main.py - 如果main.py中有东西它也需要移动。 您的另一个选择是将foo从main传递到create作为需要它的函数参数。
只是一个简单的黑客,但这在一般情况下无济于事。
在main.py进口create.py当它不通过导入调用。
# in main.py
if __name__ == '__main__':
from create import *
因此,当你通过python main.py
将导入create并且将导入create并且它将再次导入main,但这次,它将看到它被导入,因此__name__ == '__main__'
将返回False
。 因此循环的进口链将停止。
请记住,当您尝试在其他脚本中导入main.py时, 它将无法工作 ,因为create.py将不会导入。
所以要使这个东西工作,你必须执行main.py,你不能导入它。
导入模块时,Python的import
机制会执行该模块的代码来填充它,但只能执行一次。 如果多次导入同一模块,则会从sys.modules
缓存中获取它。 没有办法结束无限导入循环。
但是,Python在为其执行代码之前将模块添加到sys.modules
,因此在整个模块执行之前,它不会完全填充。 因此,如果模块A导入模块B,模块B再次导入模块A,它将看到部分初始化的模块。 这似乎是在这里发生的事情; main
导入在完全填充之前create
,因此当create
尝试访问main
某些内容时,它还不存在。
一些解决方案
import name
(不from name import
),并从脚本底部调用main函数。 这样,在执行任何其他操作之前,所有模块都将完成导入。 import create
语句向下移动到您需要访问的函数下方,因此在执行create.py
的代码之前定义它(这有点傻,但可以作为最后的手段使用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.