如何让子进程每5秒暂停执行外部程序?

5
给定一个外部程序,本例中为 python target.py

target.py

import time, itertools
A = itertools.count()
while True:
    time.sleep(.1)
    print A.next()

我正在寻找一种方法来运行命令,假设我除了启动和停止之外没有其他控制权,持续5秒钟。在那时,我想暂停执行(类似于linux上的control-Z,这是我的目标平台),运行一些内部代码,然后继续子进程的执行。到目前为止,我已经得到了:

reader.py

import subprocess, signal, time

cmd = "python target.py"
P = subprocess.Popen(cmd,shell=True)

while True:
   time.sleep(5)
   signal.pause(P)  # Not the correct way to suspend P
   print "doing something"
   signal.wakeup(P) # What is called here?

@MichaelHerrmann 这个问题可能被埋没了,但是需要这个程序在Linux机器上运行(具体来说是Ubuntu,尽管我不确定这是否有影响)。 - Hooked
抱歉,我没看到。下面是我的回答 :) - Michael Herrmann
3个回答

15

您还可以使用 psutil 来避免看起来很可怕的 os.kill:

import psutil, time, subprocess

cmd = "python target.py"
P = subprocess.Popen(cmd,shell=True)
psProcess = psutil.Process(pid=P.pid)

while True:
    time.sleep(5)
    psProcess.suspend()
    print 'I am proactively leveraging my synergies!'
    psProcess.resume()

10

既然您正在使用Linux系统,您可以使用以下的reader.py:

import subprocess, signal, time, os

cmd = "python target.py"
P = subprocess.Popen(cmd,shell=True)

while True:
   time.sleep(5)
   os.kill(P.pid, signal.SIGSTOP)
   print "doing something"
   os.kill(P.pid, signal.SIGCONT)

1
谢谢,这就可以了!但是,发送信号给进程的命令在 os.kill 下面? - Hooked
1
只是一个提示,一些命令(如mpg123)如果使用参数shell=True打开,则无法停止。请改用subprocess.Popen(['mpg123', 'audio.mp3']) - Yihui Xiong
现在显示信号没有 SIGSTOP 或 SIGCONT 属性。 - Aditya Yadav

4
我们可以使用subprocess的send_signal函数。
import subprocess
import signal
import time

p = subprocess.Popen(['mpg123', '-C', 'music.mp3'])
time.sleep(3)
print('stop')
p.send_signal(signal.SIGSTOP)
time.sleep(3)
print('continue')
p.send_signal(signal.SIGCONT)
time.sleep(3)
p.terminate()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接