这是一个有点奇怪的项目,我试图使用子进程来跟踪我按下的按键数量以衡量我的工作效率。
目前,我使用 Amazon Dash 按钮启动子进程,然后在第二次按下时终止该进程。
def start_keylogger():
global process
process = subprocess.Popen(["sudo", "python", "test.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
def stop_keylogger():
os.killpg(process.pid, signal.SIGUSR1)
process.wait()
key_press_count = process.stdout.read()
return key_press_count
从那里我的键盘记录器还没有充实起来,但我想我想使用 sys.exit()
或 exit()
返回按键次数。
def exit_and_return_counter():
sys.stdout.write(current_keypress_counter)
exit()
if __name__ == '__main__':
signal.signal(signal.SIGUSR1, exit_and_return_counter)
try:
while 1:
main_loop()
except KeyboardInterrupt:
sys.exit()
最初我尝试使用process.returncode
,但它只返回1
,我假设成功退出代码。而且我不能使用 stdout, stderr = process.communicate() 除非我想在按下第二次 Amazon 按钮后保留键盘记录器一小会儿。
最佳答案
简单地运行
os.killpg(process.pid, signal.SIGUSR1)
之后的 process.wait()
。这将等待进程结束并返回状态代码。因为你刚刚杀死了它,所以它不会阻塞太久。捕获 USR1 信号并使用 sys.exit 更改从子级返回的代码应该可行。
即使子进程被杀死,您也应该能够使用 process.stdout.read() 读取 stdout,因为为进程间通信创建的管道至少会存在Popen 对象process
存在。
关于python - 在kill()之后从子进程中检索一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32930120/