跨模块共享变量

时间:2019-08-07 11:03:24

标签: python

我有一个程序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表示)将所有输入序列化,最终导致错误(火花数据帧不可序列化)。使用一些变通办法,我到达这里是在这里使用全局变量,而没有对函数的输入。

1 个答案:

答案 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)