16

我正在用subprocessPython 启动一个程序。

在某些情况下,程序可能会冻结。这是我无法控制的。我可以从它启动的命令行中做的唯一一件事就是CtrlEsc快速杀死程序。

有什么办法可以模仿这个subprocess吗?我正在使用subprocess.Popen(cmd, shell=True)启动程序。

4

6 回答 6

25

好吧,返回的对象有几个方法subprocess.Popen()可能有用:Popen.terminate()and Popen.kill(),它们分别发送一个SIGTERMand SIGKILL

例如...

import subprocess
import time

process = subprocess.Popen(cmd, shell=True)
time.sleep(5)
process.terminate()

...将在五秒钟后终止该过程。

或者您可以使用os.kill()发送其他信号,例如SIGINT模拟 CTRL-C,使用...

import subprocess
import time
import os
import signal

process = subprocess.Popen(cmd, shell=True)
time.sleep(5)
os.kill(process.pid, signal.SIGINT)
于 2013-05-31T22:00:07.063 回答
19
p = subprocess.Popen("echo 'foo' && sleep 60 && echo 'bar'", shell=True)
p.kill()

查看subprocess模块上的文档以获取更多信息:http ://docs.python.org/2/library/subprocess.html

于 2013-05-31T21:59:50.023 回答
0

您的问题不太清楚,但是如果我假设您将要启动一个进入僵尸的进程,并且您希望能够在脚本的某些状态下控制它。如果是这种情况,我建议您:

p = subprocess.Popen([cmd_list], shell=False)

这并不是真正建议通过外壳。我建议您使用 shell=False,这样可以减少溢出的风险。

# Get the process id & try to terminate it gracefuly
pid = p.pid
p.terminate()

# Check if the process has really terminated & force kill if not.
try:
    os.kill(pid, 0)
    p.kill()
    print "Forced kill"
except OSError, e:
    print "Terminated gracefully"
于 2013-05-31T23:18:11.360 回答
0

您可以使用两个信号来终止正在运行的子进程调用,即 signal.SIGTERM 和 signal.SIGKILL;例如

import subprocess
import os
import signal
import time
..
process = subprocess.Popen(..)
..
# killing all processes in the group
os.killpg(process.pid, signal.SIGTERM)
time.sleep(2)
if process.poll() is None:  # Force kill if process is still alive
    time.sleep(3)
    os.killpg(process.pid, signal.SIGKILL)
于 2015-07-24T18:18:26.433 回答
0

以下命令对我有用

os.system("pkill -TERM -P %s"%process.pid)
于 2021-08-19T07:09:24.307 回答
-1

尝试将您的 subprocess.Popen 调用包装在 try except 块中。根据您的进程挂起的原因,您可能能够干净地退出。以下是您可以检查的异常列表: Python 3 - 异常处理

于 2020-04-20T14:18:51.090 回答