相关文章推荐
高大的包子  ·  /std (Specify ...·  1 年前    · 
爱听歌的机器人  ·  TypeScript ...·  1 年前    · 

如何让一个子进程每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?
    
2 个评论
@MichaelHerrmann 这是被埋没的问题,但这需要在Linux机器上工作(特别是Ubuntu,虽然我不确定这有什么区别)。
对不起,我没有看到。我的回答如下 :)
python
signals
subprocess
Hooked
Hooked
发布于 2013-09-24
3 个回答
Rolf Andreassen
Rolf Andreassen
发布于 2018-03-28
已采纳
0 人赞同

你也可以使用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()
    
Michael Herrmann
Michael Herrmann
发布于 2018-03-28
0 人赞同

由于你是在Linux上,你可以使用下面的阅读器.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)
    
谢谢你,这样就可以了。但是wtf,向一个进程发送信号的命令在 os.kill 下?
只需注意,一些命令,如mpg123,如果用参数 shell=True 打开,就不能被停止。用 subprocess.Popen(['mpg123', 'audio.mp3']) 代替。
现在它说信号不具有SIGSTOP或SIGCONT属性
Yihui Xiong
Yihui Xiong
发布于 2018-03-28
0 人赞同

我们可以使用子进程的 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)