【问题标题】:Static variables in Python that are shared across filesPython 中跨文件共享的静态变量
【发布时间】:2014-12-04 08:15:14
【问题描述】:

我对 Python 还是很陌生,我找不到一种方法让静态变量在不同的 Python 文件之间共享......在 Java 中,这样做似乎很简单......这就是我的我正在尝试做:

data.py

class Shared(object):
    list_vars = []
    var = ""

    @staticmethod
    def print_vars():
        print "list_vars = " + str(Shared.list_vars)
        print "var = " + Shared.var

user1.py

import time
from data import Shared

Shared.list_vars.append("001")
time.sleep(5.0)
Shared.print_vars()

# It prints:
# list_vars = ['001']
# var =

user2.py

import time
from data import Shared

Shared.var = "002"
time.sleep(5.0)
Shared.print_vars()

# It prints:
# list_vars = []
# var = 002

对不起,这可能不是最好的例子,但它抓住了这个想法......我的问题是,如果我想拥有:

list_vars = ['001']
var = 002

在运行 user1.py 和 user2.py 之后,在其中一个/甚至其他一些 python 文件或类中(我正在考虑 user1.py 和 user2.py 作为同一个软件包中的两个子程序,通常是同时运行),这样做的“Python方式”是什么?

非常感谢!

================================

问题更新:

为了更具体地说明问题,请允许我这样描述问题:

data.py

class Shared(object):
    list_vars = []
    var = ""

    @staticmethod
    def print_vars():
        print "list_vars = " + str(Shared.list_vars)
        print "var = " + Shared.var

    # Can be considered as a separate thread running in the background, waiting for messages
    @staticmethod
    def callback(message):
        if message.event == "add":
            Shared.list_vars.append(message.data)
        elif message.event == "remove" and message.data in Shared.list_vars:
            Shared.list_vars.remove(message.data)

有两个额外的文件,user1.pyuser2.py,它们的内容可以忽略暂时……

假设 user1.pyuser2.py 几乎同时运行,说时间 = 0。

  • 在时间 = 1 时,有一条消息进来(带有 message.event = "add" 和 message.data = "001"),回调函数在 data.py 被触发,"001" 被添加到变量 list_vars

  • 在时间 = 2 时,user1.py 更新变量 var data.py"002"

  • 在时间 = 3 时,如果 user2.py 想要访问并打印出 具有最新值的变量 list_varsvar

    • list_vars = ["001"]
    • var = 002

这在 Python 中如何实现?

非常感谢!

【问题讨论】:

    标签: python static singleton


    【解决方案1】:

    问题是(我想)您分别启动 user1.pyuser2.py。因此,Shared 类的静态值不会在不同的调用中保留。

    但这是一种完全正确的数据共享方式:您在一个文件中声明类甚至变量,然后在其他文件中导入。

    但是 Python 不是 Java,一切都不需要是类。你可以这样做:

    • 数据.py

      list_vars = []
      var = ""
      
      def print_vars():
          print "list_vars = " + str(Shared.list_vars)
          print "var = " + Shared.var
      
    • user1.py

      import time
      import data as shared
      
      shared.list_vars.append("001")
      time.sleep(5.0)
      shared.print_vars()
      
      # It prints:
      # list_vars = ['001']
      # var =
      
    • user2.py

      import time
      import data as shared
      
      shared.var = "002"
      time.sleep(5.0)
      shared.print_vars()
      
      # It prints:
      # list_vars = []
      # var = 002
      
    • main.py

      import user1
      # It prints:
      # list_vars = ['001']
      # var =
      import user2
      # It prints:
      # list_vars = ['001']
      # var = 002
      

    【讨论】:

    • 您好 Serge Ballesta,感谢您的回答,这解决了我在示例中描述的问题。实际上我给出的例子可能无法准确描述我面临的问题,所以请原谅,如果你有时间,你能不能也看看问题底部的更新?非常感谢!
    • @Fujiolydak :如果所有脚本都在同一个进程中运行,它们将正确共享数据。如果有不同的线程,唯一的问题是您可能需要同步对共享数据的访问。
    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多