【问题标题】:Python get bash double-tab completion outputPython 获取 bash 双制表符完成输出
【发布时间】: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


【解决方案1】:

最后我自己解决了这个问题,我直接把 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 代码,原本比较复杂,但是这个版本可以满足我现在的需要。

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

感谢您的建议:)

【讨论】:

    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 2016-04-12
    • 2011-06-11
    • 1970-01-01
    • 2013-08-18
    • 2014-03-28
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多