python - 在kill()之后从子进程中检索一个值

标签 python subprocess popen sys

这是一个有点奇怪的项目,我试图使用子进程来跟踪我按下的按键数量以衡量我的工作效率。

目前,我使用 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/

相关文章:

python - 如何使用python提高进程优先级

Python OSError : [Errno 2]

python - 如何在不使用原始字符串的情况下将 `sed` 命令传递给 `popen`?

python - 如何让 Popen 等待命令完成?

python - Odoo 中的递归编程

python - 使用 Django 注册应用程序在 Django 中处理帐户/个人资料的好地方在哪里?

python - bs4 `next_sibling` VS `find_next_sibling`

Python 和 ffmpeg

C: 由 popen() 函数执行的 Linux 命令不显示结果

python - @page 和@frame 需要 xhtml2pdf (Pisa 3.0) css 语法