两个python程序之间的通信

时间:2017-11-28 16:44:02

标签: python

请帮助我理解为什么这不起作用以及如何改变它。 我基本上希望能够从程序2中查询一个程序变量的值。所以这里是最基本的程序:

P1:

import time

gscore = 0

def get_info():
    return gscore


def main():
    global gscore
    score = 0

    while score <10:
        time.sleep(1)
        score +=1
        gscore = score
        print(score)

if __name__ == '__main__':
    main()

P2:

from functest import get_info
print(get_info())

结构可能看起来有点奇怪,但基本上我有一个现有的小型python游戏,并希望能够查询得分,这就是我以这种方式调整它的原因。因此P1显然计为10,但P2总是得到0作为返回值。我觉得我在这里犯了一个非常愚蠢的错误...... 请求帮助:)

3 个答案:

答案 0 :(得分:1)

当您在Python中import模块时,您没有执行它的内容。 if __name__ == "__main__":就是为了让你的Python文件既可以作为可重用模块,也可以作为独立程序。

如果你想执行main()功能,你需要明确地调用它。:

from functest import main, get_info
main() # calling the main function in your functest file
print(get_info()) # calling the get_info function

这将返回您要查找的值。

现在,如果您执行 functest.py 文件,将调用main

$ python functest.py
  #=> 9

答案 1 :(得分:1)

如果__name__ == '__main__'仅在从shell运行代码时执行,而不是从其他程序导入程序时执行。要解决此问题,您可以将程序修改为:

在你P1中将get_info修改为:

def get_info():
    global gscore
    return gscore

在P2中执行此操作:

from functest import main, get_info
main()
print(get_info())

另外,请注意,使用类而不是创建全局变量有更好的方法来执行您正在执行的操作。

class Score(object):
   def __init__(self, gscore=0):
      self.gscore = gscore

   def get_info(self):
      return self.gscore

   def increment(self, score=0):
      while score < 10:
         score +=1
      self.gscore = score

答案 2 :(得分:0)

导入其他程序的功能时,您将导入程序的功能,而不是程序的实际实例。我的意思是你的程序在运行时只计算到10,但10不是代码的一部分,它是一个结果。

导入它的内容是运行您导入的一些代码(在您的情况下,运行get_info代码,gscore = 0为返回的gscore,但是,这是您的其他程序的一个独特实例,因此即使gscore在您使用main方法运行的另一个程序中增加,您的第二个程序也拥有它{{1}那就是gscore。当您想要访问的程序中有一种函数库时,导入更多。

你想要的是能够,运行时间,读取其他程序生成的值。这不能用python变量完成,但可以通过许多其他方式完成。一种常见的方法是将分数写入文件,然后在其他程序中读取该文件。如果您需要有关如何读取和写入文件的信息,请阅读this guide here