我想构建一个模拟from package_name import *
的函数。虽然this question通过修改globals()
来解答人们如何做到这一点。但是,globals()
是定义函数的模块的本地。
例如,假设我在first_package.py
,
import imp
def load_contents(path):
"""Load everything from another package"""
module = imp.load_source('', path)
for k in dir(module):
if not '__' in k: # ignore __xxx__ private variables
globals()[k] = getattr(module, k)
然后在second_package.py
import first_package
first_package.load_contents('third_package.py')
什么都不会发生。我该如何解决这个问题?
答案 0 :(得分:1)
诀窍是使用sys._getframe
向上调用堆栈1步,然后检索调用者的全局变量。准确的代码是,
def load_contents(path):
"""Load contents of another configuration file"""
module = imp.load_source('', path)
glob = sys._getframe(1).f_globals # globals of calling module
for k in dir(module):
if not '__' in k: # ignore __xxx__ private variables
glob[k] = getattr(module, k)
请注意,此代码仅适用于CPython,因为sys._getframe
是特定于实现的函数。
答案 1 :(得分:1)
您可以在 first_package.py 中创建一个跨模块变量的字典变量。有关如何定义交叉模块变量的信息,请参阅链接here。请参阅 J.F.Sebastian
提供的回复采用一种不使用python内部机制的简单方法总是好的 - 因为在复杂的应用程序中可能存在此类活动的副作用
答案 2 :(得分:0)
您可以随时将调用者全局字典传递给函数,然后添加到函数中。