我正在编写一个将使用子进程的 Python 脚本。主要思想是让一个父脚本运行专门的子脚本,例如运行其他程序或自己做一些事情。父脚本和子进程之间有管道。我使用它们通过定期发送一些字符并检查响应来控制子进程是否仍在响应。问题是,当子进程在屏幕上打印任何内容(即写入 stdout 或 stderr)时,管道被破坏,一切都崩溃了。所以我的主要问题是是否有可能在子进程中阻止写入 std*,所以只有写入管道的合法响应才有可能?我已经试过了 Stop a function from writing to stdout但没有任何成功。
也欢迎其他有关父进程和子进程之间通信的想法(基于文件的管道除外)。但是,必须使用子流程。
请您参考如下方法:
我坚信您不必只接受 “当子进程在屏幕上打印任何内容(即写入 stdout 或 stderr)时,管道被破坏,一切都崩溃”。你可以解决这个问题。然后您不需要“阻止”子进程写入标准流。
正确使用 subprocess 模块的所有功能。首先,将 subprocess.PIPE 连接到子进程的每个标准流:
p = subprocess.Popen(
[executable, arg1, arg2],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
运行子进程并通过这些管道与其交互:
stdout, stderr = p.communicate(stdin="command")
如果 communicate() 不够灵活(如果您需要同时监视多个子进程和/或如果某个子进程的标准输入数据取决于其输出以响应前一个命令),您可以直接与 p.stdout、p.stderr、p.stdin 属性进行交互。在这种情况下,您可能必须构建自己的监控循环并使用 p.poll() 和/或 p.returncode。控制子进程也可以通过p.send_signal()实现。
