【问题标题】:Python Global Variables in multiple files多个文件中的 Python 全局变量
【发布时间】:2015-04-17 14:26:02
【问题描述】:

我有 2 个守护进程,它们应该访问同一个变量。 我为全局变量创建了第三个文件,每个守护进程都可以访问该变量。但是,当一个人更改变量时,另一个人仍然看到默认值。

示例:

glob.py

time = 0

守护进程:

import datetime
import time
import glob

while(True):
    glob.time = datetime.datetime.now()
    time.sleep(30)

守护进程 b:

import glob

while(True):
    print(glob.time)

每次都会打印 0 我希望我已经把我的问题说清楚了,有人可以帮助我。 如果您需要更多信息,请随时询问。

【问题讨论】:

  • 如果你的守护进程是进程,那么它们有单独的数据空间。如果它们是线程,它们共享相同的数据空间(变量)。请说明您如何创建/生成它们。
  • 另外,您应该避免将文件命名为“glob.py”,因为它会与 stdlib 模块“glob”一起出现阴影 - 这可能会导致意外错误。
  • 如果您使用的是threading,这将按预期工作。所以我假设你使用的是multiprocessing。见sharing state between processes

标签: python global-variables global


【解决方案1】:

看起来(尽管您没有明确说明)您正在以完全独立的方式运行程序:Python 解释器的两种不同调用。

没有您希望存在的魔法:就像您运行同一个程序的两个实例一样,每个实例都有自己的变量实例(全局变量或其他变量)。

如果您正在执行一些简单的任务,更简单的方法是将一个文本文件作为每个进程的输出,而另一个进程尝试从它想知道的每个进程生成的文件中读取信息 - (你甚至可以在 Unix 中使用命名管道)。

另一种方法是让 Python 脚本使用multiprocessing stdlib 模块来协调守护进程的启动,然后创建一个 multiprocessing.Manager 对象以直接在进程之间共享变量。 起初设置起来可能会更复杂,但这是干净的事情。在此处查看 Manager 类的文档: https://docs.python.org/3/library/multiprocessing.html

【讨论】:

    【解决方案2】:

    How do I share global variables across modules?

    在单个程序中跨模块共享信息的规范方法是创建一个特殊模块(通常称为 config 或 cfg)。只需在应用程序的所有模块中导入配置模块;然后该模块可作为全局名称使用。因为每个模块只有一个实例,所以对模块对象所做的任何更改都会在各处反映出来。:

    import time
    import glb
    
    while(True):
        glb.t +=  1
        time.sleep(3)
        print glb.t 
    

    b.py:

    import glb
    import a
    while(True):
        print(glb.t)
    

    glb.py:

    t = 0
    

    启动a.py后的输出:

    python b.py
    1
    2
    3
    4
    5
    6
    

    【讨论】:

    • 是的 - 这看起来像是 O.P. 试图做的事情 - 但看起来其他模块正在作为独立进程运行。 (我猜到他将它们命名为“守护进程”)
    • @jsbueno,根据标题和 OP 代码的样子,我会留下答案。在多个文件中使用全局变量才是正确的方法。
    • 我没有要求您删除答案。看起来这不是 OP 需要的正确事情 - 但其他人可能会(并且可能会)遇到这个问题。
    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多