我正在使用linux / cpython 3.3 / bash。这是我的问题:
#!/usr/bin/env python3
from subprocess import Popen, PIPE, DEVNULL
import time
s = Popen('cat', stdin=PIPE, stdout=DEVNULL, stderr=DEVNULL)
s.stdin.write(b'helloworld')
s.stdin.close()
time.sleep(1000) #doing stuff
这会让cat
成为一个僵尸(而且我很忙"做东西"并且可以“wait
关于子进程”。在bash中是否有一种方法可以包装cat
(例如通过创建一个孙子)来允许我写入cat
的stdin,但是让init接管为家长吗? python解决方案也可以工作,我也可以使用nohup,disown等。
答案 0 :(得分:1)
从另一个进程运行子进程,其唯一任务是等待它。
pid = os.fork()
if pid == 0:
s = Popen('cat', stdin=PIPE, stdout=DEVNULL, stderr=DEVNULL)
s.stdin.write(b'helloworld')
s.stdin.close()
s.wait()
sys.exit()
time.sleep(1000)
答案 1 :(得分:0)
一种解决方法可能是" daemonize"你的cat:fork,然后快速再次fork并在第二个进程中退出,第一个wait()为第二个进程。然后第三个进程可以执行exec()cat
,它将从其父级继承其文件描述符。因此,您需要先创建一个管道,然后关闭子项中的stdin,并从管道中复制它(
我不知道如何在python中做这些事情,但我相当肯定它应该是可能的。