从已运行的进程创建子进程对象
我想从一个已经在运行的进程中创建一个 subprocess.Popen
对象……这有可能吗?
还有一个想法是把这个子进程对象进行序列化(也就是用一种方式把它变成可以存储的格式),然后把它写入数据库。这样如果主进程重启了,就可以从数据库中把 subprocess.Popen
对象拿回来。我不太确定这样是否可行。
2 个回答
2
假设你想和一个叫“子进程”的程序进行交流,而且必须通过它的标准输入输出流来实现,你可以在这个可执行文件周围创建一个“包装器”,把它的输入、输出和错误信息连接到一个套接字或者命名管道上。
这样,想要控制这个“子进程”的程序就可以随时开始或停止交流。你可能还需要提供一个锁机制来确保安全。
然后,如果你是在Linux系统上,你可以通过 /proc/<pid>/fd/<0,1,2>
来访问一个正在运行的进程的标准输入、输出和错误信息。你不会直接把这些连接到一个 subprocess.Popen 对象,但 open('/proc/<pid>/fd/1', 'rb')
的表现就像 Popen().stdout
一样。
2
从一个已经在运行的进程创建一个subprocess.Popen对象
你是说从一个已经在运行的子进程吗?我知道的唯一方法是把对象进行序列化(也就是把它转成可以存储的格式),然后把它写到文件或者数据库里,就像你提到的那样。
通常情况下,子进程不能从已经在运行的子进程中再创建新的子进程,但你可以在主进程中保持对你想要创建的新进程的引用,然后从主进程中去启动它。这种做法可能会变得很复杂,我强烈建议不要这样做。你具体为什么需要让你的进程树超过两层呢?这方面的信息可能会帮助我们找到更好的解决办法。