首页 > 解决方案 > Python - 使用全局模块在程序之间传递变量

问题描述

这里的用例是我有一个主程序不断循环以获取传感器数据并执行一些计算和逻辑。同时,我有第二个程序运行烧瓶与 twilio 侦听入站短信。我试图根据短信的内容在第二个程序中设置一个变量,并根据这个变量的值在第一个程序中运行逻辑。我已经定义了一个导入到两者中的模块,并且根据它的调用方式应该设置所需的值或返回它。

为了测试这一点,我创建了一个精简的“玩具”版本,它只有两个独立的循环程序和一个全局模块。它没有按我期望的方式工作。

globaltest.py(全局模块)。

def varex(arg):

    statevar = 0

    if arg != 1:

        statevar = arg

    elif arg == 1:

        return statevar

    else:

        return 'error'

main_test.py(代表第一个程序)

它正在调用以获取由 stest 设置的 globaltest.varex 中的 statevar。

from globaltest import varex
from time import sleep

while True:

    loc_var = varex(1)

    print('local ',loc_var)

    sleep(3)

stest.py(代表烧瓶服务器)这是在 globaltest.varex 中设置 statevar,在这种情况下只是简单地向上索引

from globaltest import varex
from time import sleep

i = 2

while True:

    state = i
    i = i+1

    varex(state)

    print(state)

    sleep(1)

main_test 总是打印“local 0”,因此 globaltest.py 中的 statevar 不会被 stest.py 更新。

我似乎无法弄清楚为什么会这样,也不确定这是解决问题的最佳方法。我看过其他类似的问题,但这似乎是一个不同的用例。

标签: python

解决方案


每个 Python VM维护“全局”状态(实际上是模块级状态)。如果您希望多个进程共享信息,那么您将需要使用某种形式的 IPC 或外部存储(DBus、邮槽、域套接字、共享内存、数据库服务器等)。


推荐阅读