我正在尝试设置2个进程,一个进程执行一个功能,另一个进程用pynput
监视键盘。他们需要进行通信以彼此关闭:功能关闭后,监视功能将关闭;用户按下特定键时,监视功能将关闭。
但是,似乎我的监视过程立即关闭并且没有收听,并且我不知道为什么。
我尝试在两个进程中添加打印功能,并且它们都起作用,所以我知道它们确实会触发,但是在执行一个功能期间,我似乎无法保持failsafe
的生命。
有关该程序的更多详细信息:
我的目标是拥有一个safefunc
函数,该函数接受一个参数和三个pynput
键。 safefunc
在一个进程中在arg中运行该功能,而在另一进程中启动键盘的pynput
键盘监听器。侦听器检测到3个键,一个键暂停该功能的过程,一个键恢复该功能,另一个键停止该功能。
功能过程也应在监听过程结束时停止监听。
主文件:
import multiprocessing
from multiprocessing import Process, Pipe
import pynput
from pynput.keyboard import Listener as KeyboardListener
from pynput.keyboard import Key
import psutil
import mybunchoffunc
import time
def safefunc(function,play,pause,stop): # arg of type <enum 'Key'>
parent_conn, child_conn = Pipe()
processfailsafe = multiprocessing.Process(target = mybunchoffunc.failsafefunc, args = (play,pause,stop,child_conn))
processfunction = multiprocessing.Process(target = mybunchoffunc.funcfunc, args = (function,parent_conn))
processfailsafe.start()
processfunction.start()
processfunction.join()
safefunc(mybunchoffunc.testing,'I','O','P')
mybunchoffunc.py文件:
import pynput
from pynput.keyboard import Listener as KeyboardListener
from pynput.keyboard import Key
from multiprocessing import Process, Pipe
import psutil
import time
def failsafefunc(play,pause,stop,conn):
funcpid = conn.recv()
failpid = psutil.Process().pid
conn.send(failpid)
funcproc = psutil.Process(funcpid)
def player(key):
if key == play:
funcproc.resume()
if key == pause:
funcproc.suspend()
if key == stop:
funcproc.terminate()
return False
keyboardlistener = KeyboardListener(on_press=player)
keyboardlistener.start()
def funcfunc(function,conn):
current_process_pid = psutil.Process().pid
conn.send(current_process_pid)
function()
failpid = conn.recv()
failproc = psutil.Process(failpid)
failproc.terminate()
def testing():
for i in range(10):
print("going there "+str(i))
print([p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']])
time.sleep(2)
一些事情可以理解这段代码中发生的事情:
3周前,我开始学习python(和编程),对您来说,代码可能看起来很糟糕
我使用的是进程而不是线程,因此我可以使用psutil
函数resume(),suspend()和Terminate()
我使用2个不同的文件,因为如果Windows上运行的功能与它们位于同一个文件中,则Windows上的进程将不会启动(请花点时间来理解它)
在执行此代码时,process函数会正常运行,然后在尝试关闭侦听进程时会出现一条错误消息,因为它已经死了(NoSuchProcess: psutil.NoSuchProcess no process found with pid 16880
)。我不知道为什么聆听过程无法持续进行。