繁体   English   中英

使用Python类在Python脚本之间共享数据

[英]Using a Python Class to share data between Python scripts

我想知道在Python中使用包含列表的类是否像内存数据库一样有意义。

class MyData(object):
    def __init__(self):
        self._data = ['apple', 'orange', 'banana']

    @property
    def data(self):
        return self._data

    @classmethod
    def append(self, item):
        self._data.append(item)

这是场景:

第一个python脚本a.py将导入此类MyData并使用其列表中的数据。

第二个python脚本b.py在无限循环中连续轮询在线API,导入相同的类并将更多项添加到列表中。

a.py运行时,它应该能够读取列表中新添加的项目。

问题:这是一个好主意,还是我们最好使用像MySQL / redis这样的真实数据库?

更新 :数据不需要保留到磁盘

这对您的描述不起作用。 a.pyb.py将在不同的python解释器上运行,因此不会共享内存(即它们不会共享该类)。

如果想法是要在不同的python进程上运行a.py和b.py,则需要使用进程间通信或类似方法将数据持久化在磁盘上的某个地方...我的最佳建议? 通过数不胜数的python模块仅使用您的数据库,使您可以与之通信,这就是它们的用途。

现在,如果问题是关于在模块之间共享对象状态,下面是一个简单的示例,向您展示如何实现:

storage.py:

class Storage(object):

    def __init__(self):
        self._data = ['apple', 'orange', 'banana']

    @property
    def data(self):
        return self._data

    def append(self, item):
        self._data.append(item)

Storage = MyData()

a.py:

from storage import Storage


class A():

    def __init__(self):
        self.count = 0

    def __str__(self):
        self.count += 1
        return f"read count={self.count} data={','.join(Storage.data)}"

b.py:

from storage import Storage


class B():

    def __init__(self):
        self.count = 0

    def write(self, item):
        Storage.append(item)

test.py:

from a import A
from b import B

if __name__ == "__main__":
    reader = A()
    writer = B()

    print(f"Initial state of storage {reader}")
    for i, item in enumerate(["pomegranate", "watermelon", "strawberry"]):
        writer.write(item)
        print(reader)

有关此主题的更多信息,您可以检查一下。 是否有一种简单,优雅的方法来定义单例? 或类似的线程谈论python&singletons。

假设a.py不需要输出任何其他内容, a.py只需print即可输出需要传输的数据,例如:

#a.py
for i in range(6):
    print("data:{}".format(i))

然后通过将输出管道b.pyb.py ,后者可以接收带有input (python2的raw_input

#b.py
try:
    while True:
        data = input()
        print("recieved data:", repr(data))
except EOFError: #raised when input stream is closed
    print("data stopped coming")

然后,您可以使用|将它们一起运行 在命令提示符下通过管道传输数据:

Tadhgs-MacBook-Pro:codes Tadhg$ python3 a.py | python3 b.py
recieved data: 'data:0'
recieved data: 'data:1'
recieved data: 'data:2'
recieved data: 'data:3'
recieved data: 'data:4'
recieved data: 'data:5'
data stopped coming

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM