Как связать переменную между двумя запущенными python программами? - PullRequest
0 голосов
/ 13 февраля 2020

Я использую Pynput для создания программы, которая, в общем, будет что-то делать, пока нажата клавиша.

Проведя некоторое исследование Pynput, я обнаружил, что нет никакого способа и, похоже, не существует запланированного способа что-то сделать, пока нажата клавиша, поэтому я разрабатываю свой способ обойти это. .

Мой план состоит в том, чтобы запустить одновременно два сценария Python, которые имеют постоянно обновляемую переменную, связанную между собой. Это связано с тем, что циклы while останавливают прослушиватели Pynput при использовании в одной программе. Один из этих сценариев будет прослушивать клавиатуру и соответствующим образом обновлять переменную, а другой будет фактически выполнять результат.

Единственная проблема заключается в том, что я понятия не имею, как активно связать переменную между двумя работающими сценариев, и ничто в inte rnet не дало мне представления о том, как это сделать (я пытался импортировать другие сценарии и другие вещи, но не только это было сложно, потому что я использую Ma c, но это не переменная активно не передается).

В настоящее время мой код выглядит примерно так:

(скрипт слушателя)

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')

Переменная, которую я хочу связать между ними, будет doThing, но, опять же, я не знаю, как на самом деле установить переменную таким образом. Я думал об использовании JSON, но я не знаю, является ли это лучшим способом сделать это.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Вот пример использования потоков. Это позволяет 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")
0 голосов
/ 13 февраля 2020

Вы уже рассматриваете возможность использования временного файла? Вот пример:

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()
...