我正在使用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是以不同的方式使用还是应该使用其他工具完全更改代码?
请帮帮我:)。
答案 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代码,它最初更复杂,但是这个版本做了我现在需要的。
我希望它对其他人也有用。
感谢您的建议:)