终止由子流程调用启动的脚本以模拟按键

时间:2019-07-23 19:05:50

标签: python subprocess

我正在运行一个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 ] ------------

1 个答案:

答案 0 :(得分:1)

使用系统功能杀死脚本

假设您正在Posix系统(例如Linux)上运行,则可以使用信号来终止脚本,而无需使用特定于脚本的命令来退出脚本。您使用的terminate()方法将SIGTERM发送到您的子流程。接收到该信号后,脚本似乎没有退出。您可以使用send_signal方法发送其他信号。 SIGINT通常是程序运行时按ctrl-c发送的信号。通常,发送SIGTERMSIGINT是个好主意,因为正在运行的程序可以捕获这些内容并进行所需的任何清理。但是,这也意味着它可以捕获信号并完全忽略它。它不能忽略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")