Python获取bash双标签完成输出

时间:2016-09-02 01:04:09

标签: python bash subprocess ros

我正在使用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"))

但这不起作用,因为&#34; \ t \ t&#34;没有在Popen处理,就像它在终端一样。

有没有办法让这个工作或者是不可能从python脚本中模拟终端的双标签完成?

Popen是以不同的方式使用还是应该使用其他工具完全更改代码?

请帮帮我:)。

1 个答案:

答案 0 :(得分:0)

最后我自己解决了这个问题,我直接抛出Ros自己的代码并找出它如何生成bash完成输出。

我的代码现在是这样的:

from subprocess import Popen, PIPE
package = "<package>"
comm = str("catkin_find --first-only --without-underlays --libexec " + package).split ()
out, err = Popen (comm, stdout = PIPE, stderr = PIPE).communicate ()
out = out.decode ("ascii")
if (out.strip () == ""):
    return
comm = "find -L " + out.strip () + " -type f -exec basename {} ';'"
out, err = Popen (comm, shell = True, stdout = PIPE, stderr = PIPE).communicate ()
out = out.decode ("ascii")
print (out.strip ())

我简化了Ros代码,它最初更复杂,但是这个版本做了我现在需要的。

我希望它对其他人也有用。

感谢您的建议:)