【发布时间】:2016-09-02 01:04:09
【问题描述】:
我正在用 python 编写一个 Ros 接口,我希望能够在我选择一个包后从显示所有可用节点的列表中选择我想要运行的节点。
换句话说,我想创建一个包中包含的所有节点的列表,如果我键入以下内容,我将在终端中获得输出:
rosrun <package-name> \t\t
就 python 代码而言,我正在尝试做的错误示例可能是:
from subprocess import Popen, PIPE
p = Popen (["rosrun", "<package-name>", "\t\t"], stdout = PIPE, stderr = PIPE)
out, err = p.communicate ()
print (out.decode ("ascii"))
print (err.decode ("ascii"))
但这不起作用,因为“\t\t”在 Popen 中没有像在终端中那样处理。
有没有什么办法可以让这个工作正常进行,或者是否不可能从 python 脚本中模拟终端的双制表符完成?
Popen 会以不同的方式使用,还是我应该使用其他工具完全更改代码?
请帮帮我:)
【问题讨论】:
-
我不确定这样做的正确方法,但我并不惊讶这种方法不起作用。在此示例中,您正在直接运行进程
rosrun,并要求它执行制表符完成,但通常是在调用程序之前执行制表符完成的外壳程序。也许如果您尝试使用shell=True运行它。 . .但我对此不是很有信心。 -
是的,我写这个例子只是为了解释我需要什么。不,
shell=True无法解决,我已经尝试过...我读过一些关于 pty 的内容,但我什至不知道它是什么。 -
看看这个问题可能会做很多你想做的事:stackoverflow.com/q/9137245/4687135
标签: python bash subprocess ros