停止从Python启动的正在运行的进程

停止从Python启动的正在运行的进程,python,subprocess,Python,Subprocess,我有一个ROS代码rostopic pub toggle\u led std\u msgs/Empty,它基本上启动一次并一直运行,直到按下CTRL+C。 现在,我想从Python中自动执行此命令。我检查了,但它只显示了如何启动命令。 我将如何在需要时启动和停止运行此流程 我将如何在需要时启动和停止运行此流程 好吧,正如你在上一句中所说的,你已经知道如何开始了 你怎么阻止它?如果您想完全像Ctrl-C一样停止它,*您可以在Windows上使用它,或者在Unix上使用SIGTERM。*因此: im

我有一个ROS代码
rostopic pub toggle\u led std\u msgs/Empty
,它基本上启动一次并一直运行,直到按下
CTRL+C

现在,我想从Python中自动执行此命令。我检查了,但它只显示了如何启动命令。
我将如何在需要时启动和停止运行此流程

我将如何在需要时启动和停止运行此流程

好吧,正如你在上一句中所说的,你已经知道如何开始了

你怎么阻止它?如果您想完全像Ctrl-C一样停止它,*您可以在Windows上使用它,或者在Unix上使用
SIGTERM
。*因此:

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),那么您可以让它变得更简单:它保证执行与
send\u signal(SIGTERM)
相同的操作。因此:

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


由于您在一篇评论中问到“请您向
subprocess.Popen()
”解释各种参数好吗:它们有很多(请参阅和在文档中,但我只使用了一个
args
参数

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


*请注意,“完全像Ctrl-C”可能不是您在Windows上想要的,除非该程序具有控制台并且是进程组所有者。这可能意味着您需要添加到
Popen
调用。或者,如果您使用
shell=True
,则可能不是


**在Python中,您通常可以忽略
CTRL\u C\u EVENT
SIGTERM
之间的平台差异,并始终使用后者,但是
子进程。send\u signal
是少数不能使用的地方之一。在Windows上,
send\u signal(SIGTERM)
将调用
terminate
而不是发送Ctrl-C。如果您实际上并不关心进程是如何停止的,只是它以某种方式停止了,那么当然可以使用
SIGTERM
…但是在这种情况下,您也可以调用
terminate

检查这一点:根据具体情况有很多方法可以做到这一点您需求的详细信息(脚本还做什么?是否要多次运行脚本并对rostopic进行后台监控?是gui还是命令行?)。如果您想要的不仅仅是对操作的模糊描述,那么您确实需要发布代码。@tdelaney我只想要一个适用于任何命令行代码的通用解决方案。有几种类似的命令会一直运行到手动停止。因此,我相信代码在这里不适用。这很完美。谢谢请将各种参数解释为<代码>子进程.PONEN()/>代码> @ KANISKAGANGULY,它是您想用子进程运行的命令的参数列表,如果您想运行<代码> ls -L>代码>,您可以这样做:<代码> P=子进程。Popen([ ls ],-L)]@abarnert此应用程序仅适用于Linux,因此Windows案例是没有意义的。但我明白你的意思。@KanishkaGanguly:好吧,这使事情变得更简单。请参阅我更新的答案;你可以使用
终止
而不是
发送信号
,然后你甚至不需要
信号
模块。