我希望能够在 python 中生成一个进程并进行两种通信。当然,Pexpect 做到了这一点,并且确实是我可能采用的一种方式。但是,它并不十分理想。
我的理想情况是拥有一个只涉及标准 python 库的跨平台通用技术。子进程非常接近,但我必须等待进程终止才能安全地与之交互这一事实是不可取的。
查看文档,它确实说有一个我可以直接操作的标准输入、标准输出和标准错误文件描述符,但是有一个很大的警告说“不要这样做”。不幸的是,它并不完全清楚为什么存在这个警告,但从我从谷歌收集到的信息是它与操作系统缓冲有关,并且当这些内部缓冲区失败时,可以编写出意外死锁的代码(作为旁注,任何例子显示错误的方式和正确的方式将不胜感激)。
因此,冒着代码陷入潜在死锁的风险,我认为使用 poll 或 select 从正在运行的进程交互读取而不杀死它可能会很有趣。虽然我失去了(我认为)跨平台能力,但我喜欢它不需要额外的库的事实。但更重要的是,我想知道这是否是个好主意。我还没有尝试过这种方法,但我担心可能会破坏我的程序的陷阱。它可以工作吗?我应该测试什么?
在我的具体情况下,我并不真正关心能否写入进程,只是反复读取它。另外,我不希望我的进程转储大量文本,所以我希望避免死锁问题,但是我想确切地知道这些限制是什么,并能够编写一些测试来查看它在哪里发生故障。