一个 python 程序打开了一个 C++ 程序的新进程,并正在读取进程标准输出。到目前为止没有问题。
但是有可能有多个这样的流进行通信吗?如果我也滥用 stderr,我可以得到两个,但不能更多。破解它的简单方法是使用临时文件。有没有更优雅的东西不需要绕道文件系统?
PS:也欢迎*nix特定的解决方案
一个 python 程序打开了一个 C++ 程序的新进程,并正在读取进程标准输出。到目前为止没有问题。
但是有可能有多个这样的流进行通信吗?如果我也滥用 stderr,我可以得到两个,但不能更多。破解它的简单方法是使用临时文件。有没有更优雅的东西不需要绕道文件系统?
PS:也欢迎*nix特定的解决方案
在 unix 系统上;打开子进程的常用方法是 with fork()
,这将在子进程和父进程中保留任何打开的文件描述符(代表打开文件或套接字的小整数),然后exec()
,这也允许新的可执行文件使用文件描述符在旧进程中打开的。此功能保留在subprocess.Popen()
调用中(可通过close_fds
参数调整)。因此,您可能想要做的是使用os.pipe()
创建成对的套接字进行通信,然后使用Popen()
启动另一个进程,并使用先前调用返回的每个 fd 的参数pipe()
来告诉它应该使用哪个 fd。
假设Windows机器。您可以尝试使用剪贴板在 python 进程和 C++ 之间交换信息。
分配一些唯一的进程ID,然后是您的信息并将其写入python端的剪贴板.....现在只需解析C++端的字符串。它类似于使用临时文件,但都在内存中完成.....但缺点是您不能将剪贴板用于任何其他应用程序。希望能帮助到你
使用传统的同步编程和标准 Python 库,您的要求很难完成。相反,如果您考虑使用异步编程模型和Twisted库,那简直是小菜一碟。Using Processes HOWTO描述了如何轻松地与任意数量的进程通信。诚然,Twisted 有一些学习曲线,但值得付出努力。