阻止写入标准输出

  • 本文关键字:标准输出 python ipc
  • 更新时间 :
  • 英文 :


我正在编写一个将使用子进程的Python脚本。主要思想是有一个运行专用子脚本的父脚本,例如运行其他程序或自己做一些事情。父脚本和子进程之间有管道。我使用它们来控制子进程是否仍在响应,方法是定期发送一些字符并检查响应。问题是,当子进程在屏幕上打印任何内容(即写入 stdout 或 stderr)时,管道会损坏,一切都会崩溃。所以我的主要问题是是否可以阻止在子进程中写入 std*,因此只有写入管道的合法响应才有可能?我已经尝试过阻止函数写入标准输出,但没有任何成功。

也欢迎在父进程和子进程之间进行通信的其他想法(基于文件的管道除外)。但是,必须使用子进程。

我坚信您不仅必须接受"当子进程在屏幕上打印任何内容(即写入 stdout 或 stderr)时,管道被破坏并且一切都崩溃"。你可以解决这个问题。然后,您无需"阻止"子进程写入标准流。

正确利用子过程模块的所有功能。首先,将subprocess.PIPE连接到子流程的每个标准流:

p = subprocess.Popen(
        [executable, arg1, arg2],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)

运行子流程并通过这些管道与其交互:

stdout, stderr = p.communicate(stdin="command")

如果communicate()不够灵活(如果您需要同时监视多个子进程和/或某个子流程的 stdin 数据依赖于其响应先前命令的输出),您可以直接与p.stdoutp.stderrp.stdin属性进行交互。在这种情况下,您可能必须构建自己的监视循环并利用p.poll()和/或p.returncode。控制子过程也可以通过p.send_signal()实现。

您可以将在执行请求的程序之前执行的函数传递给subprocess.Popen

def close_std():
    os.close(0)
    os.close(1)
    os.close(2)
p = subprocess.Popen(cmd, preexec_fn=close_std)

注意使用低级os.close;关闭sys.std*只会在分叉的Python进程中起作用。另外,请注意,如果您的底层程序是 Python 脚本,则当它们尝试写入封闭文件描述符时,它们可能会因异常而死亡。

最新更新