2016-09-02 3 views
0

私はPythonでRosインタフェースをプログラミングしています。パッケージを選択すると、使用可能なすべてのノードを示すリストから実行したいノードを選択することができます。言い換えればPython get bashダブルタブ補完出力

私が入力した場合、私は私がターミナルでなければならない出力を得るパッケージに含まれるすべてのノードのリストを作成したいと思います:

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はこれとは別の方法で使用されますか、他の機能を使用してコードを完全に変更する必要がありますか?

私を助けてください:)

+0

私はこれを行う正しい方法はわかりませんが、私はこのアプローチがうまくいかないことに驚くことはありません。この例では、プロセス 'rosrun'を直接実行し、タブの補完を要求しますが、通常はプログラムを呼び出す前にタブ補完を行うシェルです。もしあなたが 'shell = True'でそれを実行しようとするなら、おそらく。 。 。しかし私はそれを自信がない。 –

+0

はい私は、私が必要とするものだけを説明するためにその例を書いた。いいえ、 'shell = True'は解決しない、私はすでに試してみた... ** pty **について何か読んでいるが、私はそれが何であるか分からない。 –

+0

あなたが望むものをたくさんするかもしれないこの質問をチェックしてください:http://stackoverflow.com/q/9137245/4687135 –

答えて

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のコードを単純化し、それはもともと、より複雑だったが、このバージョンでは、私は今のところ必要なものを行います。

他の人にも役立つことを願っています。

アドバイスありがとう:)

関連する問題