如何在两个python脚本之间共享一个变量

时间:2016-07-23 01:52:48

标签: python arrays variables

我是蟒蛇的极端菜鸟,所以如果有更好的方式去做我要问的事,请告诉我。

我有一个文件,可以用于在地图上创建标记。它有一个存储这些标记的数组。我通过命令提示符启动文件,并多次打开该文件。基本上,如何多次打开文件,让它们共享一个变量(与拥有一个与超级文件共享变量的子文件不同。)我可以创建另一个启动实例的文件,如果需要,但我不确定我是怎么做到的。

这是我想要完成的一个例子。我有一个名为let的文件 比如说,test.py:

global number
number += 1
print(number)

我喜欢它,所以当我通过命令提示符(python test.py)多次启动它时,它会打印以下内容:

1
2
3
4
5

上述与我拥有的唯一区别在于,我所拥有的将是非终止并持续运行

3 个答案:

答案 0 :(得分:2)

您似乎在寻找的是某种形式的进程间通信。就python而言,每个进程都有自己的内存空间和自己的变量,这意味着如果我运行。

number += 1
print(number)

多次,我会在新线上获得1,2..5。无论我多少次启动脚本,数字都是全局的。

有几种方法可以保持一致性。

写入文件(命名管道)

您的一个脚本可以有(generator.py)

import os
num = 1
try:
    os.mkfifo("temp.txt")
except:
    pass # In case one of your other files already started
while True:
    file = open("temp.txt", "w")
    file.write(num)
    file.close() # Important because if you don't close the file
    # The operating system will lock your file and your other scripts
    # Won't have access

    sleep(# seconds)

在您的其他脚本(consumer.py)

while True:
    file = open("temp.txt", "r")
    number = int(file.read())
    print(number)
    sleep(# seconds)

您可以根据需要启动1个左右的生成器和许多消费者。注意:这确实存在无法避免的竞争条件。当您写入文件时,您应该使用像pickler或json这样的序列化程序来正确编码和解码数组对象。

其他方式

您还可以查找如何使用管道(命名和未命名),数据库,ampq(恕我直言,这是最好的方法,但有一个学习曲线和添加的依赖项),如果你感觉大胆使用mmap。

设计变更

如果您愿意听取设计更改,因为您正在制作一个内存中具有变量的烧瓶应用程序,为什么不设置端点来为您的阵列提供服务并且每隔一段时间检查一次端点?

 import json # or pickle
 import flask

 app = Flask(__name__)
 array = [objects]
 converted = method_to_convert_to_array_of_dicts(array)
 @app.route("/array")
 def hello():
     return json.dumps(array)

您需要进行转换,然后可以托管Web服务器,而您的客户只需要

import requests
import json

while True:
    result = requests.get('localhost/array')
    array = json.loads(str(result.body)) # or some string form of result
    sleep(...)

答案 1 :(得分:1)

您的描述有点令人困惑,但如果我理解正确,一种方法是将变量的值保存在单独的文件中。

当脚本需要该值时,请从文件中读取值并向其中添加一个值。如果文件不存在,请使用默认值1.最后,使用新值重写文件。

但是你说这个值会在两个python脚本之间共享,所以你必须小心两个脚本不会同时尝试访问该文件。

答案 2 :(得分:0)

我认为您可以使用<?php if(isset($_POST['login'])){ //connect to DB $link = mysqli_connect('localhost','root','','check_staff_up'); echo mysqli_error($link); //getting username and password from form $username = $_POST['username']; $password = $_POST['password']; //check if there is a username $query = mysqli_query($link,'SELECT * FROM details WHERE u_name LIKE "%$username"'); echo mysqli_error($query); if(mysqli_fetch_row($query)==0){ echo mysqli_error(mysqli_fetch_row($query)); echo "<script>alert('Username Does not exist')</script>"; } else if(mysqli_fetch_row($query)!=0){ echo "<script>alert('Username Exist')</script>"; } } ?> 将数据(您的数组)存储到文件中。在下次运行脚本时,您可以使用pickle.dump(your array, file)

加载数据