我如何 link 两个 运行 python 程序之间的变量?

How can I link a variable between two running python programs?

我正在使用 Pynput 创建一个程序,简而言之,它会在按住某个键时执行某些操作。

在对 Pynput 进行一些研究后,我发现没有办法而且似乎没有计划的方法来在按住某个键的同时做某事,所以我正在设计我的方法。

我的计划是同时拥有两个 Python 脚本 运行,它们之间有一个不断更新的变量 linked。这是因为 while 循环在一个程序中使用时会停止 Pynput 侦听器。其中一个脚本将监听键盘并相应地更新变量,另一个将实际执行结果。

唯一的问题是我不知道如何在两个 运行 脚本之间主动 link 一个变量,并且互联网上没有任何内容让我知道如何这样做(我试过导入其他脚本和东西,但不仅因为我使用的是 Mac 很困难,而且它没有主动传递变量)。

目前,我的代码看起来有点像这样:

(侦听器脚本)

from pynput import keyboard

doThing = 0

def on_press(key):
    doThing = 1

def on_release(key):
    doThing = 0

def startListener():
    listener = keyboard.Listener(
        on_press=on_press,
        on_release=on_release)
    listener.join()

(做某事的脚本)

while True:
    if doThing == 1:
        print('Thing')

我想在它们之间 link 的变量是 doThing,但我又不知道如何实际设置变量。我正在考虑使用 JSON,但我不知道这是否是最好的方法。

谢谢!

您已经考虑使用临时文件?这是示例:

from pynput import keyboard

doThing = 0

def generate_variable(var): 
    with open("temp", "a") as temp:
        temp.write(str(var)) 

def on_press(key):
    generate_variable(1)

def on_release(key):
    doThing = 0

def startListener():
    listener = keyboard.Listener(
        on_press=on_press,
        on_release=on_release)
    listener.join()

关于第二个脚本:

def truncate_file(): 
    with open("temp","w"): 
        pass 

while True:
    doThing = len(open("temp", "r").read()) > 0
    if doThing:
        print('Thing')
        truncate_file()

这是一个使用线程的例子。这允许 Python 到 运行 两个(或更多)独立的线程,每个线程同时做不同的事情。 (从技术上讲,它们实际上并不是同时发生的,而是交替发生的,但这在这种情况下并不重要)。

在一个线程中,您监听按键。在另一个线程中,您检查键状态并做出适当的反应。

import threading
from pynput import keyboard

class KeyCheckThread(threading.Thread):
    def __init__(self):
        super(KeyCheckThread, self).__init__()
        self.doThing = 0

    def on_press(self, key):
        self.doThing = 1

    def on_release(self, key):
        self.doThing = 0

    def run(self):
        with keyboard.Listener(on_press=self.on_press, on_release=self.on_release) as listener:
            listener.join()


listenerThread = KeyCheckThread()
listenerThread.start()

while(True):
    if listenerThread.doThing == 1:
        print("doThing")