我正在运行一个python脚本,该脚本使用popen方法使用子进程模块执行脚本。我遇到的问题是,即使有终止命令,我通过popen调用的脚本仍保持运行。 请注意-当我自己运行.par脚本时,终止脚本的唯一方法是发送击键-“ e” + return。我有一个问题是如何在运行脚本5秒钟后将其杀死。这是我到目前为止所拥有的-
#! /usr/bin/python
import subprocess
pro = subprocess.Popen('/home/xxx/bin/xxy.par', shell=True)
out=pro.communicate()
print out ### this prints out the output of the .par script
pro.terminate() ### this is for killing the .par script
.par脚本运行时的输出。退出脚本的方法是发送密钥-e + enter。否则它将继续运行并连续报告状态信息。
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
I 09:56:26 <phase: control_ue> - RadioState: ON, Airplane Mode: OFF, RegState: REG_HOME, Data: CONNECTED, RAT: LTE, PING: OFF, QXDM: OFF, Battery: 100%
I 09:56:26 <phase: control_ue> - , RSRP: -86, RSSNR: 30.0, RSRQ: -7, PCI: 24, TAC: 766666, eNB/cellId: ddd
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
I 09:56:26 <phase: control_ue> - RadioState: ON, Airplane Mode: OFF, RegState: REG_HOME, Data: CONNECTED, RAT: LTE, PING: OFF, QXDM: OFF, Battery: 100%
I 09:56:26 <phase: control_ue> - , RSRP: -86, RSSNR: 30.0, RSRQ: -7, PCI: 24, TAC: 766666, eNB/cellId: ddd
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
I 09:56:26 <phase: control_ue> - RadioState: ON, Airplane Mode: OFF, RegState: REG_HOME, Data: CONNECTED, RAT: LTE, PING: OFF, QXDM: OFF, Battery: 100%
I 09:56:26 <phase: control_ue> - , RSRP: -86, RSSNR: 30.0, RSRQ: -7, PCI: 24, TAC: 766666, eNB/cellId: ddd
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
答案 0 :(得分:1)
使用系统功能杀死脚本
假设您正在Posix系统(例如Linux)上运行,则可以使用信号来终止脚本,而无需使用特定于脚本的命令来退出脚本。您使用的terminate()
方法将SIGTERM
发送到您的子流程。接收到该信号后,脚本似乎没有退出。您可以使用send_signal
方法发送其他信号。 SIGINT
通常是程序运行时按ctrl-c发送的信号。通常,发送SIGTERM
或SIGINT
是个好主意,因为正在运行的程序可以捕获这些内容并进行所需的任何清理。但是,这也意味着它可以捕获信号并完全忽略它。它不能忽略SIGKILL
信号(也可以通过kill()
方法发送),因此,如果其他信号不起作用,则可以使用它。
链接的文档介绍了Windows系统上的不同行为。
请注意,由于脚本需要在stdin上输入,因此您可能必须确保stdin已连接到管道,以免其挂起以等待输入。
import subprocess
import signal
pro = subprocess.Popen('/home/xxx/bin/xxy.par', shell=True, stdin=subprocess.PIPE)
out=pro.communicate()
# Ask your process to exit politely
pro.send_signal(signal.SIGINT)
# Be more insistent (these are equivalent)
pro.send_signal(signal.SIGKILL)
pro.kill()
将退出命令发送到脚本
由于脚本具有退出命令,因此您也可以通过stdin
与它通信以发送该命令。进行Popen
调用时,必须通过将脚本上的stdin
连接到管道来进行设置。然后,您可以使用communcate
方法向其发送命令:
import subprocess
pro = subprocess.Popen('/home/xxx/bin/xxy.par', shell=True, stdin=subprocess.PIPE)
out=pro.communicate("e")