如何独立地在 python 中的多个模块中使用和更新同一个变量?
How to use and update same variable across multiple modules in python independently?
我有 3 个文件,我想执行如下操作
[1] conf.py
var = 10 # Intialized with 10 (start)
[2] file_1.py
import conf
print(conf.var) # Prints 10
conf.var = 1000 # Updated to 1000
[3] file_2.py
import conf
print(conf.var) # Prints 1000
conf.var = 9999 # Updated to 9999
我想要这样的东西。假设文件 file_1 和 file_2 will be running and will stay in memory unless pressed CTRL+C
。如何更改其他 2 个文件中的 var
并保留它的值?如果我们像其他 2 个文件一样在 file_3 中使用它,var
的最终值应该是 9999。 [它应该打印 9999] 等等。
执行顺序file_1.py -> file_2.py
.
帮我确定一些方法或一些 module/package 可以处理这个问题。
谢谢! :)
你不能使用 class 并且从不初始化对象吗?
class Conf:
var = 10
然后您将更新 Conf 为:
from conf import Conf
...
Conf.var = ...
永远不要使用 Conf()...
,因为这会创建一个对象实例。
考虑这种方法:
class Lookup:
# For allowing storing and looking up variables using variable sets of key pairs.
# Each key pair is a key-value pair tuple.
# The entire set of key pair tuples uniquely stores and retreives a variable value.
# frozenset is used to achieve the benifit of a set while ensuring immutability, so it can be hashed for use as a dictionary key.
lookupDictionary = {}
def put(*, keyPairs, value):
Lookup.lookupDictionary[frozenset(keyPairs)] = value
def get(*, keyPairs, default, matchWildcard = False): # No substring searching. only '*' can be used for searching for an entire string
if matchWildcard and True in [bool(x) for x in [(y[1] == '*') for y in keyPairs]]:
# If we are here, we need to match using wildcard.
valuedKeyPairs = set([y for y in keyPairs if not y[1] == '*']) # Separating value pairs from wildcard pairs
starKeyPairs = set(keyPairs) - valuedKeyPairs
starKeyPairNames = [x[0] for x in starKeyPairs]
return [Lookup.lookupDictionary[i] for i in Lookup.lookupDictionary.keys() if set(valuedKeyPairs).issubset(i) and sorted(starKeyPairNames) == sorted([x[0] for x in i-valuedKeyPairs])]
return Lookup.lookupDictionary.get(frozenset(keyPairs), default)
def getAllValues(*, keyPairs):
# Returrns all qualifying values to part or all of the key pairs
return [Lookup.lookupDictionary[i] for i in set(Lookup.lookupDictionary.keys()) if set(keyPairs).issubset(i)]
class utils:
def setCacheEntry(*, zipFileName, functionName, value):
Lookup.put(keyPairs = [('__zipFileName__',zipFileName),('__functionName__',functionName)],value=value)
def getCacheEntry(*, zipFileName, functionName, default):
return Lookup.get(keyPairs = [('__zipFileName__',zipFileName),('__functionName__',functionName)],default=default)
from Lookup import utils
from Lookup import Lookup
utils.setCacheEntry(zipFileName='FileName.zip',functionName='some_func',value='some_value')
utils.getCacheEntry(zipFileName='FileName.zip',functionName='some_func', default=1)
输出:
'some_value'
这是一个更简单的案例:
from Lookup import Lookup
def setParamValue(*, paramName, value):
Lookup.put(keyPairs = [('__paramName__',paramName),],value=value)
def getParamValue(*, paramName, default):
return Lookup.get(keyPairs = [('__paramName__',paramName),],default=default, matchWildcard=True)
setParamValue(paramName='name', value='John')
setParamValue(paramName='age', value=23)
getParamValue(paramName='name', default='Unknown')
输出:约翰
getParamValue(paramName='age', default=-1)
输出:23
getParamValue(paramName='*', default='Unknown')
输出:['John', 23]
如果需要在不同的程序之间进行通信variables/objects,
以上不起作用。
为此,您可以使用 pickle 在 OS 中转储和加载对象:
我没有测试过它是否会深度或浅度倾倒对象,但可能是后者。
import pickle
# Dumping
with open('object_pickle','wb') as f:
pickle.dump('some_value', f)
# Loading
with open('object_pickle','rb') as f2:
var = pickle.load(f2)
print(var)
输出:'some_value'
我解决了这个问题。我会建议使用像 Redis
或 memcached
这样的共享内存缓存提供程序。两者都启动了一个我们需要连接的服务器实例,并像 key-value 商店一样使用它。请注意,值应为 str
或 bytes
.
类型
内存缓存
安装memcached
sudo apt install memcached
使用默认设置启动服务器
使用前需要先启动服务器或者在linux
中设置为服务
sudo service memcached start
安装python memcached 客户端
pip install pymemcache
示例代码
from pymemcache.client import base
client = base.Client(('localhost', 11211))
client.set('some_key', 'stored value')
client.get('some_key') # Returns "stored value"
Redis
redis 的过程完全相同
安装redis
sudo apt install redis
使用默认设置启动服务器
使用前需要先启动服务器或者在linux
中设置为服务
sudo service redis start
安装pythonredis客户端
pip install redis
示例代码
import redis
client = redis.Redis() # Default settings/credentials
client.set('some_key', 'stored value')
client.get('some_key') # Returns "stored value"
用法
- Redis 提供了更多的安全性和容错性。
- 两者都有一些内存限制,但都是可配置的。如果您的数据更大,请使用适合您问题的文件或数据库。
- 两者都易于配置
我有 3 个文件,我想执行如下操作
[1] conf.py
var = 10 # Intialized with 10 (start)
[2] file_1.py
import conf
print(conf.var) # Prints 10
conf.var = 1000 # Updated to 1000
[3] file_2.py
import conf
print(conf.var) # Prints 1000
conf.var = 9999 # Updated to 9999
我想要这样的东西。假设文件 file_1 和 file_2 will be running and will stay in memory unless pressed CTRL+C
。如何更改其他 2 个文件中的 var
并保留它的值?如果我们像其他 2 个文件一样在 file_3 中使用它,var
的最终值应该是 9999。 [它应该打印 9999] 等等。
执行顺序file_1.py -> file_2.py
.
帮我确定一些方法或一些 module/package 可以处理这个问题。
谢谢! :)
你不能使用 class 并且从不初始化对象吗?
class Conf:
var = 10
然后您将更新 Conf 为:
from conf import Conf
...
Conf.var = ...
永远不要使用 Conf()...
,因为这会创建一个对象实例。
考虑这种方法:
class Lookup:
# For allowing storing and looking up variables using variable sets of key pairs.
# Each key pair is a key-value pair tuple.
# The entire set of key pair tuples uniquely stores and retreives a variable value.
# frozenset is used to achieve the benifit of a set while ensuring immutability, so it can be hashed for use as a dictionary key.
lookupDictionary = {}
def put(*, keyPairs, value):
Lookup.lookupDictionary[frozenset(keyPairs)] = value
def get(*, keyPairs, default, matchWildcard = False): # No substring searching. only '*' can be used for searching for an entire string
if matchWildcard and True in [bool(x) for x in [(y[1] == '*') for y in keyPairs]]:
# If we are here, we need to match using wildcard.
valuedKeyPairs = set([y for y in keyPairs if not y[1] == '*']) # Separating value pairs from wildcard pairs
starKeyPairs = set(keyPairs) - valuedKeyPairs
starKeyPairNames = [x[0] for x in starKeyPairs]
return [Lookup.lookupDictionary[i] for i in Lookup.lookupDictionary.keys() if set(valuedKeyPairs).issubset(i) and sorted(starKeyPairNames) == sorted([x[0] for x in i-valuedKeyPairs])]
return Lookup.lookupDictionary.get(frozenset(keyPairs), default)
def getAllValues(*, keyPairs):
# Returrns all qualifying values to part or all of the key pairs
return [Lookup.lookupDictionary[i] for i in set(Lookup.lookupDictionary.keys()) if set(keyPairs).issubset(i)]
class utils:
def setCacheEntry(*, zipFileName, functionName, value):
Lookup.put(keyPairs = [('__zipFileName__',zipFileName),('__functionName__',functionName)],value=value)
def getCacheEntry(*, zipFileName, functionName, default):
return Lookup.get(keyPairs = [('__zipFileName__',zipFileName),('__functionName__',functionName)],default=default)
from Lookup import utils
from Lookup import Lookup
utils.setCacheEntry(zipFileName='FileName.zip',functionName='some_func',value='some_value')
utils.getCacheEntry(zipFileName='FileName.zip',functionName='some_func', default=1)
输出: 'some_value'
这是一个更简单的案例:
from Lookup import Lookup
def setParamValue(*, paramName, value):
Lookup.put(keyPairs = [('__paramName__',paramName),],value=value)
def getParamValue(*, paramName, default):
return Lookup.get(keyPairs = [('__paramName__',paramName),],default=default, matchWildcard=True)
setParamValue(paramName='name', value='John')
setParamValue(paramName='age', value=23)
getParamValue(paramName='name', default='Unknown')
输出:约翰
getParamValue(paramName='age', default=-1)
输出:23
getParamValue(paramName='*', default='Unknown')
输出:['John', 23]
如果需要在不同的程序之间进行通信variables/objects, 以上不起作用。 为此,您可以使用 pickle 在 OS 中转储和加载对象: 我没有测试过它是否会深度或浅度倾倒对象,但可能是后者。
import pickle
# Dumping
with open('object_pickle','wb') as f:
pickle.dump('some_value', f)
# Loading
with open('object_pickle','rb') as f2:
var = pickle.load(f2)
print(var)
输出:'some_value'
我解决了这个问题。我会建议使用像 Redis
或 memcached
这样的共享内存缓存提供程序。两者都启动了一个我们需要连接的服务器实例,并像 key-value 商店一样使用它。请注意,值应为 str
或 bytes
.
内存缓存
安装memcached
sudo apt install memcached
使用默认设置启动服务器
使用前需要先启动服务器或者在linux
中设置为服务sudo service memcached start
安装python memcached 客户端
pip install pymemcache
示例代码
from pymemcache.client import base
client = base.Client(('localhost', 11211))
client.set('some_key', 'stored value')
client.get('some_key') # Returns "stored value"
Redis
redis 的过程完全相同
安装redis
sudo apt install redis
使用默认设置启动服务器
使用前需要先启动服务器或者在linux
中设置为服务sudo service redis start
安装pythonredis客户端
pip install redis
示例代码
import redis
client = redis.Redis() # Default settings/credentials
client.set('some_key', 'stored value')
client.get('some_key') # Returns "stored value"
用法
- Redis 提供了更多的安全性和容错性。
- 两者都有一些内存限制,但都是可配置的。如果您的数据更大,请使用适合您问题的文件或数据库。
- 两者都易于配置