在 Python 中,如何从导入的模块访问主模块的命名空间?

Posted

技术标签:

【中文标题】在 Python 中,如何从导入的模块访问主模块的命名空间?【英文标题】:In Python, how can I access the namespace of the main module from an imported module? 【发布时间】:2011-04-08 13:55:37 【问题描述】:

具体来说,我需要从导入模块的主模块中获取一些对象和全局变量。当父模块想要从子模块中获得某些特定的东西时,我知道如何找到这些东西,但我不知道如何朝另一个方向发展。

【问题讨论】:

嗯,好吧,我想一定是这样,因为我在任何地方都找不到任何答案。底线是我不关心重用这些代码,我只是想把这个项目分成多个文件,这样更容易找到我要找的东西。老实说,我真的不知道自己在做什么,所以这是一次学习经历,但实际上我只是希望在我想要编辑的时候更容易找到我想要编辑的代码。 我同意应该有一种方法可以在导入模块时将参数传递给模块——就像将参数传递给对象构造函数一样。但是我从来没有找到一个干净的方法来做到这一点。 出于完全相同的原因,我一直在寻找完全相同的东西,所以这似乎是一个典型的新手.. 类似:Accessing argparse arguments from the class 在 CR SE 【参考方案1】:
import __main__

但不要这样做。

【讨论】:

@Alcott:因为它可以很容易地将你的程序变成椒盐卷饼。 @IgnacioVazquez-Abrams 你能扩展一下吗?【参考方案2】:

您正在寻找的答案是:

import __main__

main_global1= __main__.global1

但是,每当一个模块 module1 需要来自 __main__ 模块的东西时,那么:

__main__ 模块应将所有必要的数据作为参数提供给module1 函数/类, 或者您应该将需要共享的所有内容放在另一个模块中,并在__main__module1 中将其导入为import module2

【讨论】:

【参考方案3】:

我认为这可行:

import sys    
main_mod = sys.modules['__main__']

【讨论】:

这相当于import __main__ as main_mod【参考方案4】:

不确定这是否是一个好习惯,但也许您可以将所需的对象和变量作为参数传递给您在导入模块中调用的方法或类。

【讨论】:

这实际上是建议的方法,尽管 OP 似乎正在寻找 __main__

以上是关于在 Python 中,如何从导入的模块访问主模块的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

python导入模块的方法都有哪些

python导入类

在python程序编写过程中,如何解决模块名称冲突?

Rust无法将Singleton从全局空间导入另一个文件中的另一个模块

如何获取由python模块导入的模块列表

如何将参数传递给 Python 模块中的主函数?