python中各模块变量共享的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中各模块变量共享的问题。相关的知识,希望对你有一定的参考价值。

想用python编写一个开放式的系统,然后在这个开放式的系统中能够方便的添加各种功能模块。现在的问题是,各功能模块要共享一些变量,而全局变量global不能跨模块。这些变量挺多的,用函数传的话感觉一句话就特别长,不好看。我采用的是设立了一个数据库,供各模块访问。但老师说,从数据库里访问数据效率太低。问能不能有更好的方法实现各模块间的数据共享。

做一个类似配置文件的常量文件,把要全局共享的内容,作为变量声明并赋值,各模块import进来追问

这个方法感觉挺好。
能不能给个简单的小例子。

追答

contstance.py
...
DB_HOST='localhost'
DB_PORT=27017
DATABASE=‘DB’
...

other.py
from contstance import *

# from constance import DB_HOST,DB_PORT,DB
connect(DB_HOST,DB_PORT)
...

追问

这样虽然可以在other.py 中引用constance.py中的变量,但却不可以在other.py中改变constance.py中的变量的值(虽然可以在other.py中重新给变量赋值,但是另一个模块,比如other1.py再引用时,仍是原来的那个值)。这种情况不是我想要的。
虽然如此,仍然非常感谢您的悉心指导。

参考技术A 用global可以跨模块,比如
在test1.py定义变量a
global a = ""
在test2.py中给a赋值
1、导入test2模块
2、在函数中给a赋值
test1.a = "tt"

这样在其它模块就可以通过global a访问变量了
参考技术B 楼主用 redis 吧,redis 正是你要找的。它是内存数据库,速度快,可存储变量、数组、序列等等,内容也可更改。可以用它实现跨线程、跨进程传递数据,非常爽。如果配上 RPC,还可以用 redis 做跨电脑跨服务器的数据交换中心。
还有更爽的,redis 有发布和订阅功能,你可用它设置发布和订阅,当一个线程或进程(发布者)向 redis 存储或修改数据后,所有订阅者线程或进程都会得到通知,从而来取数据,这样可避免低效的轮询,爽的很。
参考技术C 不要一直听老师的。要自己想想自己的思路咯!慢慢来 不着急!

python 多模块文件共享变量

Python import 包的机制是,import进来的和默认的系统的module了,都放在sys.module这个字典里面.
多个py文件再次import的时候,会先去sys.module里面检查是否已经import了,如果已经import了,就不再重复import,否则就import进来

===

import glovar和from comon import glovar的命名空间是一样的,key都是glovar

from common.glovar import x 则不一样,test.py中这样from import,就相当于在test.py文件中写了一行代码x = 1,
此时x就是test自己命名空间中的变量。所以x只在test.py中有效,无聊自己如何对x修改,都无法影响glovar 中的x

#换种说法
from glovar import x
#等同于
improt glovar
x= glovar.x
#你调用x的时候,就是自己的命名空间中的x
#当你执行x=2时,完全影响不到glovar.x

下面是解释

#引入当前glovar文件,此时namespace是glovar
import glovar

#从common目录中引入glovar,此时namespace是glovar
from comon import glovar

#从common目录中的glovar文件中引入x=1,此时namespace就是引用者,也就是上面的test.py
from common.glovar import x 

所以,如果需要共享变量,就不要使用from file import x这种形式,而是使用import file,然后就可以通过file.x来使用,然后file.x=‘abc‘可以进行修改。这样都这样处理全局性的变量就可以共享的。也就是保持一个独立的namespace,这样python不会再次导入,从而实现共享。



作者:coreki
链接:http://www.jianshu.com/p/4bb742d7d672
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。







以上是关于python中各模块变量共享的问题。的主要内容,如果未能解决你的问题,请参考以下文章

python中的多处理模块和修改共享的全局变量

python实现在不同模块中共享全局变量

如何动态共享包范围的配置变量?

[python模块]队列queue

RF变量的共享使用、python测试库

用Tkinter打造自己的Python IDE开发工具变量数据共享机制及小白量化策略编写