首页 > 解决方案 > 使用 subprocess.run 从 Python 中的线程执行 shell 命令后丢失 ioctl

问题描述

我正在尝试使用 subprocess.run 执行一些 shell 脚本或命令。执行是由一个线程完成的。因此,每个线程将使用 subprocess.run 生成执行一个命令或脚本,然后完成。
所有的执行都正常进行。但是,我注意到程序完成后的大部分时间,我的 Linux 终端都会丢失它的 ioctl。
我检查了stackoverflow的答案,发现这种行为发生是因为某些程序(例如vim)不需要io,因此它会通知内核在启动时不要使用它,并在退出时返回ioctl。有时,退出不是那么顺利,因此程序无法返回 ioctl。
好的,我得到了答案,但是几乎每次运行后,我的 python 脚本都会发生这种丢失 ioctl 的行为。然后我必须发出重置命令来取回 ioctl。
我正在使用 python 版本 3.8.10
我的代码如下:

    def _execute_suprocess(self,cmd, on_error_cb = None):
        completed_process = subprocess.run(cmd, shell=True, 
            stdout = subprocess.PIPE, stderr= subprocess.PIPE)

        if completed_process.returncode != 0 and on_error_cb is not None:
            on_error_cb(cmd, completed_process)
    
    def foo(self):
        #there's a loop that read some commands to be executed then execute each of them in a thread
        running_cmd = Thread(target=self._execute_suprocess, args=(cmd, self._on_cmd_execution_error))
        running_cmd.start()

我尝试过使用子进程,例如添加/删除标准输出、标准错误、启用捕获输出,但它没有帮助。
您对此的根本原因有任何想法吗?

标签: pythonsubprocess

解决方案


推荐阅读