是否可以使用独立的执行脚本b.py从脚本a.py中读取变量
示例:a.py
#!/usr/bin/env python3
import time
i = 0
def run():
global i
print(i)
i = i+1
def get_i():
return i
def main():
pass
if __name__ == "__main__":
while True:
run()
time.sleep(5)
print("Stopped")
不.朋友
#!/usr/bin/env python3
import a
print(a.get_i())
如果执行b.py,它将打印0,但我希望它打印在a.py中设置的i的当前状态,所以我必须大于0。
我已尝试使用额外的c.py,其中i被保存为全局变量,然后c.py在a.py和b.py中导入,但它是相同的行为:b.py打印i的初始值而不是值是在a.py中设置的
注意:a.py在b.py之前启动,并且由于while循环仍在运行,然后执行b.py.
在a.py
中,您创建了值为i
的变量0
。这是在b.py
内导入的(顺便说一下,你甚至可以做import a; a.i
,这也会做同样的事情)。
什么都没有改变这个变量的状态,因为run
中的a.py
只是声明了,没有被运行。如果你想让它改变你的变量,你可以从b.py
运行它:
from a import run, get_i
run()
print(get_i())
或者你可以在run
执行a.py
。这是99%的不良做法,你应该知道为什么需要这个,如果你这样做:
# a.py
i = 0
def run():
...
run()
这样,run
将在导入期间执行,因为python只是在导入期间执行文件中的所有内容。
另一种方法是使用公共配置文件(例如config.txt)来存储i值。我的意思的最小例子如下:
啊.朋友
#!/usr/bin/env python
i = 0
# create a config.txt in the same directory
def get_i():
with open('config.txt', 'r') as f:
last_i = f.read().splitlines()[-1]
return last_i
def run():
global i
while True:
i += 1
with open('config.txt', 'a') as f:
f.write(str(i)+'\n')
if __name__ == '__main__':
try:
run()
except KeyboardInterrupt:
exit(0)
和b.py如下:
#!/usr/bin/env python
print __import__('a').get_i()
虽然这是一个非常简单的例子,但你想要做的是编程中的一个不好的做法。另外正如我所说,这是一个非常简单的例子,但在现实生活中,访问公共资源的问题并不那么简单。