我有一个程序main.py
,它根据用户提供的输入为一些参数生成值。我需要与其他模块aux.py
共享这些变量。为此,我执行了以下操作(下面的简化代码)-
此main.py
文件:
# these three variables are dynamically calculated depending on the user provided input
a = 12
b = 13
c = 14
def declare_global():
global a, b, c
declare_global()
import aux
aux.print_all()
这是aux.py
文件
def print_all():
a = globals()['a']
b = globals()['b']
c = globals()['c']
print(a)
print(b)
print(b)
运行main.py
文件会导致以下错误
回溯(最近通话最近):文件 “ /Users/new/Library/Preferences/PyCharmCE2018.3/scratches/global_experiment/main.py”, 第13行 aux.print_all()文件“ /Users/new/Library/Preferences/PyCharmCE2018.3/scratches/global_experiment/aux.py”, 第2行,在print_all中 a = globals()['a'] KeyError:'a'
有一个非常相似的帖子解决了同一问题here,但是那里的帖子建议将所有全局变量添加到新文件中,然后导入创建的文件。但是我不能这样做,因为我没有这些变量将取什么值的先验信息。
那么,如何在模块之间共享变量?
编辑
为了给出一个简单的例子,我失去了实际程序的一些复杂性。我之所以不能将变量a,b,c
传递给print_all
函数,是因为在实际程序中,变量a,b,c
无法序列化。它们是spark数据框对象。我在那里使用的模块之一(在这里我用print_all
表示)将所有输入序列化,最终导致错误(火花数据帧不可序列化)。使用一些变通办法,我到达这里是在这里使用全局变量,而没有对函数的输入。
答案 0 :(得分:0)
a = 12
b = 13
c = 14
import aux
aux.print_all(a, b, c)
然后您的aux文件将变为:
def print_all(a, b, c):
a = globals()['a']
b = globals()['b']
c = globals()['c']
print(a)
print(b)
print(b)