我有一个ROS代码rostopic pub toggle_led std_msgs/Empty
,它基本上会启动一次并一直运行直到CTRL+C
被按下。
现在,我想从Python自动执行此命令。我检查了Calling an external command in Python,但它只显示了如何启动命令
我将如何开始和停止运行此过程?
答案 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
Constructor和Frequently Used Arguments ,但我只使用一个args
参数。
通常,您将列表传递给args
,程序名称作为列表中的第一个元素,每个单独的命令行参数作为单独的元素。但是如果你想使用shell,你需要为args
传递一个字符串,并添加一个shell=True
作为另一个参数。
*请注意,“完全类似于Ctrl-C”可能实际上并不是您想要的,除非该程序具有控制台并且是进程组所有者。这可能意味着您需要在Popen
电话中添加creationflags=subprocess.CREATE_NEW_PROCESS_GROUP
。或者它可能不是 - 例如..,如果你使用shell=True
。
**在Python中,您通常可以忽略CTRL_C_EVENT
和SIGTERM
之间的平台差异,并始终使用后者,但subprocess.send_signal
是您可以选择的少数几个地方之一“T。在Windows上,send_signal(SIGTERM)
会调用terminate
而不是发送Ctrl-C。如果你实际上并不关心进程是如何停止的,只是它以某种方式被停止,那么当然你可以使用SIGTERM
...但在这种情况下,你也可以只调用terminate
。 子>