【问题标题】:Python access variable by two different files两个不同文件的Python访问变量
【发布时间】:2018-01-29 21:43:19
【问题描述】:

是否可以使用独立的执行脚本 b.py 从脚本 a.py 中读取变量

示例: 一个.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")

b.py

#!/usr/bin/env python3

import a

print(a.get_i())

如果执行 b.py,它将打印 0,但 i 希望它打印在 a.py 中设置的 i 的当前状态,所以 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。你没有做的是在 a.py 中设置它的值。由于您将 a.py 作为导入调用,因此您的 if 永远不会运行
  • 好吧,也许我错过了一点。 a.py 在 b.py 之前启动,并且由于 while 循环而仍在运行,然后执行 b.py。
  • @HansDampf 那么,您正在同时运行两个不同的进程并希望在它们之间共享数据?
  • 我有一个一直在设置变量的.py。然后我有 b.py,它在 a.py 开始后的随机时间执行,并且 b.py 应该得到在 a.py 中设置的变量

标签: python python-3.x global-variables


【解决方案1】:

a.py 中创建变量i,其值为0。这是在b.py 中导入的内容(顺便说一句,你甚至可以只做import a; a.i,这也是一样的)。

没有改变这个变量的状态,因为a.py 中的run 仅在声明中,没有被运行。如果您希望它改变您的变量,您可以从 b.py 运行它:

from a import run, get_i
run()
print(get_i())

或者你可以在a.py中执行run。这是 99% 的坏习惯,如果你愿意,你应该真正知道为什么需要这样做:

# a.py
i = 0

def run():
    ...

run()

这样run将在导入期间执行,因为python只是在导入期间执行文件中的所有内容。

【讨论】:

  • 如果他真的只想导入所有的...他也可以做​​ a.run()
  • 如果 a.py 未在 b.py 中导入,有没有办法从 a.py 中获取 b.py 中的变量?
  • 不是直接的。如果您想在运行脚本一段时间后获取数据而不直接调用它,则需要将此状态存储在某处。比方说,在磁盘上的文件中。
【解决方案2】:

另一种方法是使用通用配置文件(例如 config.txt)来存储 i 值。 我的意思的一个最小示例如下:

a.py

#!/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()

虽然这是一个非常简单的示例,但您在编程中尝试做的是一种不好的做法。同样正如我所说,这是一个非常简单的示例,但在现实生活中访问公共资源的问题并不是那么简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2013-09-06
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多