如何在Python中跨脚本共享变量?

xipsam 发布于 2019-11-10 python 最后更新 2019-11-10 12:10 268 浏览

以下不起作用 one.py

import shared
shared.value = 'Hello'
raw_input('A cheap way to keep process alive..')
two.py
import shared
print shared.value
在两条命令行上运行:
>>python one.py
>>python two.py
(第二个得到一个属性错误,正确如此)。 有没有办法做到这一点,即在两个脚本之间共享一个变量?
已邀请:

nnam

赞同来自:

你在这里尝试做什么(通过单独的python解释器在Python模块中存储共享状态)将不起作用。 模块中的值可以由一个模块更新,然后由另一个模块读取,但这必须在同一个Python解释器中。你在这里做的实际上是一种进程间通信;这可以通过两个进程之间的套接字通信来完成,但它远远不如你期望在这里工作那么简单。

cet

赞同来自:

您需要将变量存储在某种持久性文件中。根据您的具体需要,有几个模块可以执行此操作。 pickle和cPickle模块可以将大多数python对象保存并加载到文件中。 搁置模块可以将python对象存储在类似字典的结构中(在幕后使用pickle)。 dbm / bsddb / dbhash / gdm模块可以将字符串变量存储在类似字典的结构中。 sqlite3模块可以将数据存储在轻量级SQL数据库中。 其中大多数问题的最大问题是它们不是在不同进程之间同步 - 如果一个进程读取值而另一个进程正在写入数据存储区,那么您可能会得到不正确的数据或数据损坏。为了解决这个问题,您需要编写自己的文件锁定机制或使用完整的数据库。

sed_et

赞同来自:

使用文本文件或环境变量。由于这两个单独运行,你不能真正做你想做的事情。

inemo

赞同来自:

我建议你使用multiprocessing模块。您无法从命令行运行两个脚本,但您可以让两个单独的进程轻松地相互通信。 从doc的例子中:

from multiprocessing import Process, Queue
def f(q):
    q.put([42, None, 'hello'])
if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()

walias

赞同来自:

如果不将信息存储在解释器的两个实例外部的某个位置,您将无法执行所需的操作。
如果它只是你想要的简单变量,你可以轻松地将一个python dict转储到一个带有pickle模块的文件中,然后在脚本一中重新加载它。 例: one.py

import pickle
shared = {"Foo":"Bar", "Parrot":"Dead"}
fp = open("shared.pkl","w")
pickle.dump(shared, fp)
two.py
import pickle
fp = open("shared.pkl")
shared = pickle.load(fp)
print shared["Foo"]

oalias

赞同来自:

内容太长未翻译

liste

赞同来自:

你可以使用相对简单的mmap文件。 您可以使用shared.py来存储公共常量。以下代码将适用于不同的python解释器\ scripts \ processes shared.py:

MMAP_SIZE = 16*1024 
MMAP_NAME = 'Global\\SHARED_MMAP_NAME'
*“全局”是全局名称的Windows语法 one.py:
from shared import MMAP_SIZE,MMAP_NAME                                                        
def write_to_mmap():                                                                          
    map_file = mmap.mmap(-1,MMAP_SIZE,tagname=MMAP_NAME,access=mmap.ACCESS_WRITE)             
    map_file.seek(0)                                                                          
    map_file.write('hello\n')                                                                 
    ret = map_file.flush() != 0                                                               
    if sys.platform.startswith('win'):                                                        
        assert(ret != 0)                                                                      
    else:                                                                                     
        assert(ret == 0)                                                                      
two.py:
from shared import MMAP_SIZE,MMAP_NAME                                          
def read_from_mmap():                                                           
    map_file = mmap.mmap(-1,MMAP_SIZE,tagname=MMAP_NAME,access=mmap.ACCESS_READ)
    map_file.seek(0)                                                            
    data = map_file.readline().rstrip('\n')                                     
    map_file.close()                                                            
    print data                                                                  
*此代码是为windows编写的,linux可能需要很少的调整 更多信息,请访问 - https://docs.python.org/2/library/mmap.html

psequi

赞同来自:

sudo apt-get install memcached python-memcache one.py

import memcache
shared = memcache.Client(['127.0.0.1:11211'], debug=0)
shared.set('Value', 'Hello')
two.py
import memcache
shared = memcache.Client(['127.0.0.1:11211'], debug=0)    
print shared.get('Value')

paut

赞同来自:

在您的示例中,第一个脚本运行完成,然后运行第二个脚本。这意味着你需要某种持久状态。其他答案建议使用文本文件或Python的pickle模块。我个人懒惰,当我可以使用pickle时,我不会使用文本文件;为什么要编写解析器来解析我自己的文本文件格式? 您也可以使用json模块将其存储为JSON,而不是pickle。如果您希望将数据共享到非Python程序,这可能是更可取的,因为JSON是一个简单而通用的标准。如果您的Python没有json,请获取simplejson。 如果您的需求超出了picklejson - 假设您实际上希望同时执行两个Python程序并实时更新持久状态变量 - 我建议您使用SQLite数据库。使用ORM将数据库抽象出来,这非常简单。对于SQLite和Python,我推荐Autumn ORM