subprocess:在后台启动进程,在一次调用中启动另一个进程

时间:2017-05-02 05:16:03

标签: python subprocess suspend

这个程序应该立即回应睡眠的pid:

import subprocess
subprocess.check_output("sleep 1 & echo $!", shell=True)

直接在shell上运行它,它立即打印pid,但是在python中运行它,忽略&并且在echo执行之前需要1秒。

如何只使用一次check_output(或subprocess的其他功能)来执行此操作?

(这是一个简化的例子,实际上代替sleep 1我自己的可执行文件)

1 个答案:

答案 0 :(得分:1)

check_output等待输出管道关闭,sleep也有它们。您可以重定向到/dev/null以立即返回。

subprocess.check_output("sleep 1 >/dev/null 2>&1 & echo $!", shell=True)

更新

很难判断sleep 1是否真的在后台运行,所以我写了一个稍微大一点的测试。

test.py - 将时间写入stdout 5秒

import time

for i in range(5):
    print(time.strftime('%H:%M:%S'), flush=True)
    time.sleep(1)
print('done', flush=True)

runner.py - 运行测试将stdout重定向到文件并监控文件。

import subprocess as subp
import time
import os

# run program in background
pid = int(subp.check_output("python3 test.py >test.out 2>&1 & echo $!",
    shell=True))
print("pid", pid)

# monitor output file
pos = 0
done = False
while not done:
    time.sleep(.1)
    if os.stat('test.out').st_size > pos:
        with open('test.out', 'rb') as fp:
            fp.seek(pos)
            for line in fp.readlines():
                print(line.strip().decode())
                done = b'done' in line
            pos = fp.tell()
print("test complete")

运行它,我得到了

td@mintyfresh ~/tmp $ python3 runner.py
pid 24353
09:32:18
09:32:19
09:32:20
09:32:21
09:32:22
done
test complete