子进程:在后台启动进程并在一次调用中启动另一个进程
subprocess: start process in background and start another in one call
这个程序应该立即回显 sleep 的 pid:
import subprocess
subprocess.check_output("sleep 1 & echo $!", shell=True)
运行 直接在 shell 上,它会立即打印 pid,但是 运行 它在 python 上,&
被忽略并且它在执行 echo
之前需要 1 秒。
如何只执行一次 check_output
(或 subprocess
的另一个函数)?
(这是一个简化的示例,实际上我会放自己的可执行文件而不是 sleep 1
)
check_output
等待输出管道关闭并且 sleep
也有它们。您可以重定向到 /dev/null
以获得即时 return.
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 - 运行s 测试将 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
这个程序应该立即回显 sleep 的 pid:
import subprocess
subprocess.check_output("sleep 1 & echo $!", shell=True)
运行 直接在 shell 上,它会立即打印 pid,但是 运行 它在 python 上,&
被忽略并且它在执行 echo
之前需要 1 秒。
如何只执行一次 check_output
(或 subprocess
的另一个函数)?
(这是一个简化的示例,实际上我会放自己的可执行文件而不是 sleep 1
)
check_output
等待输出管道关闭并且 sleep
也有它们。您可以重定向到 /dev/null
以获得即时 return.
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 - 运行s 测试将 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