【问题标题】:Python3: Catch SIGTTOU from subprocess and print warningPython3:从子进程中捕获 SIGTTOU 并打印警告
【发布时间】:2021-07-30 09:12:58
【问题描述】:

您好,我编写的一个小型调试 GUI 有问题(使用 PySimpleGUI)。 GUI 的一部分是调用本地 Linux shell 命令的能力。

如果我在后台启动 GUI(使用 &),我想要执行的其中一个 shell 命令/程序会返回一个 SIGTTOU 信号。这将冻结 GUI,直到我使用 'fg' 将 GUI 置于前台。

由于在后台启动 GUI 很正常,我只想捕捉 SIGTTOU 信号,打印警告并继续。

下面的代码 sn-p 有点工作,但让 shell 命令成为僵尸(我没有从命令中得到返回值。更好的是使用 signal.signal(signal.SIGTTOU, signal.SIG_IGN) 但我真的想打印一个警告。这可能吗?signal.SIG_IGN 用什么来清除僵尸?

        cmd_output = collections.deque()

        ...

        def _handle_sigttou(signum, frame):

            sys.__stdout__.write('WARNING: <SIGTTOU> received\n')

        def _run_shell_command(cmd, timeout=None):

            # run command
            p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

            # process output
            for line in p.stdout:
                line = line.decode(errors='backslashreplace').rstrip()
                cmd_output.appendleft((f'{line}'))

            # wait for return code
            retval = p.wait(timeout)

            # print result
            cmd_output.appendleft((f'✘ ({retval})') if retval else ('✅'))


        # send command

        signal.signal(signal.SIGTTOU, _handle_sigttou)
        #signal.signal(signal.SIGTTOU, signal.SIG_IGN)   # this works without zombies, but I want to print a warning

        threading.Thread(target=_run_shell_command, args=(_line, 60), daemon=True).start()

【问题讨论】:

    标签: python signals


    【解决方案1】:

    使用window.write_event_value(event, value) 将事件发送到您的窗口,然后在您的事件循环中当event 时调用sg.popup 以显示value。不要尝试在您的线程上更新 GUI。

    ...
    
    def _handle_sigttou(signum, frame):
        window.write_event_value("<SIGTTOU>", ("WARNING", "<SIGTTOU> received"))
    ...
    
    while True:
        event, values = window.read()
        if event == sg.WINDOW_CLOSED:
            break
        elif event == "<SIGTTOU>":
            title, message = values[event]
            sg.popup(message, title=title, auto_close=True, auto_close_duration=2)
    
    window.close()
    

    【讨论】:

    • 对不起,我觉得我的代码示例有点太多了(只是更新了一点)。线程不直接写入 GUI。据我了解,我认为这个问题与 PySimpleGUI 没有太大关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2018-05-02
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多