停止从Python启动的运行进程

时间:2014-11-21 22:33:54

标签: python subprocess

我有一个ROS代码rostopic pub toggle_led std_msgs/Empty,它基本上会启动一次并一直运行直到CTRL+C被按下。
现在,我想从Python自动执行此命令。我检查了Calling an external command in Python,但它只显示了如何启动命令 我将如何开始和停止运行此过程?

1 个答案:

答案 0 :(得分:1)

  

我将如何开始和停止运行此过程?

好吧,你已经知道如何启动它,正如你在上一句中说的那样。

你怎么阻止它?如果你想完全像Ctrl-C那样停止它,*你可以通过在其上调用send_signal,在Windows上使用CTRL_C_EVENT或在Unix上调用SIGTERM来实现。**所以:< / p>

import signal
import subprocess

try:
    sig = signal.CTRL_C_EVENT
except NameError:
    sig = signal.SIGTERM

p = subprocess.Popen(['/path/to/prog', '-opt', '42', 'arg'])
# ... later
p.send_signal(sig)

如果你只关心Linux(或者通常是* nix),你可以使这更简单:terminate保证与send_signal(SIGTERM)做同样的事情。所以:

import subprocess
p = subprocess.Popen(['/path/to/prog', '-opt', '42', 'arg'])
# ... later
p.terminate()

由于您在评论中提到“请您解释subprocess.Popen()的各种参数”:嗯,其中有很多参数(请参阅文档中的Popen ConstructorFrequently Used Arguments ,但我只使用一个args参数。

通常,您将列表传递给args,程序名称作为列表中的第一个元素,每个单独的命令行参数作为单独的元素。但是如果你想使用shell,你需要为args传递一个字符串,并添加一个shell=True作为另一个参数。


*请注意,“完全类似于Ctrl-C”可能实际上并不是您想要的,除非该程序具有控制台并且是进程组所有者。这可能意味着您需要在Popen电话中添加creationflags=subprocess.CREATE_NEW_PROCESS_GROUP。或者它可能不是 - 例如..,如果你使用shell=True

**在Python中,您通常可以忽略CTRL_C_EVENTSIGTERM之间的平台差异,并始终使用后者,但subprocess.send_signal是您可以选择的少数几个地方之一“T。在Windows上,send_signal(SIGTERM)会调用terminate而不是发送Ctrl-C。如果你实际上并不关心进程是如何停止的,只是它以某种方式被停止,那么当然你可以使用SIGTERM ...但在这种情况下,你也可以只调用terminate

相关问题