我想从已经运行的进程中创建一个subprocess.Popen
对象......这有可能吗?
另一个想法是序列化(pickle)子进程对象并将其写入数据库,这样如果主进程重新启动,它可以从数据库中获取subprocess.Popen
个对象。我不确定这是否有效。
答案 0 :(得分:2)
从已经运行的进程创建一个subprocess.Popen对象
你的意思是从已经运行的子流程?我知道在进程之间传递对象的唯一方法是将它们腌制并按照您的建议将它们写入文件或数据库。
通常,子流程不能从已经运行的子流程中生成,但您可以保留对要创建的新流程的引用,并从主流程生成它。这可能会变得非常丑陋,我建议强烈反对。为什么,特别是你需要进一步推进你的过程树?这些信息可能会带来更好的答案。
答案 1 :(得分:2)
假设您想要与“子进程”通信并且必须使用其标准i / o流进行通信,您可以创建一个围绕可执行文件的包装器,将其stdin / out / err映射到套接字或命名管道。
打算控制“子进程”的程序可以随时启动和停止通信。您可能还必须提供锁定机制。
然后,假设您使用的是Linux,则可以通过/proc/<pid>/fd/<0,1,2>
访问正在运行的进程的stdin / out / err。您不会将这些连接到subprocess.Popen对象,但open('/proc/<pid>/fd/1', 'rb')
的行为类似于Popen().stdout
。