2017-08-17 4 views
0

現在、ROS(ロボットオペレーティングシステム)用の一般的な設定ツールを作成しています。POpenでサブプロセスに引数を渡すことができません

enter image description here

最初の2つの列がきちんとした方法rospack list(システムにインストールされているすべてのパッケージを一覧表示コマンドによる作成にかなり単純です:私はこのようなtreeviewを作成していsubprocess.POpen()Tkinterを使用して)開発者が独自のパッケージを作成し、それぞれのワークスペース内にあるものを含めては動作します:

ros_packages_install_retrieve = subprocess.Popen(["rospack list"], shell=True, stdout=subprocess.PIPE) 
ros_packages_installed = [] 
for ros_package in ros_packages_install_retrieve.stdout.readlines(): 
    ros_package_adapted = ros_package.split(" ") 
    ros_package_adapted[1] = ros_package_adapted[1][:-1] 
    ros_packages_installed.append(ros_package_adapted) 

列が必要な問題のウィットによるトリッキーなものですh rospack depends <package>(ビルドおよび/または実行するためにシステム上に存在する必要があるすべてのパッケージをリストします)。 ros_packages_installed内にある各パッケージのために私は次の関数を呼び出します。

def get_deps(ros_package): 
    ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", ros_package], shell=True, stdout=subprocess.PIPE) 
    ros_package_deps = [] 
    for ros_package_dep in ros_package_deps_retrieve.stdout.readlines(): 
     ros_package_dep = ros_package_dep.split("\n") 
     ros_package_dep = ros_package_dep[:-1] 
     ros_package_deps.append(ros_package_dep) 

    return ros_package_deps 

問題は、私は

[rospack] Error: no package given

を取得していますし、戻り値は常に空のリストであるということです。私はさらに、コマンド自体にros_package引数を連結しようとしましたが、すべてが無駄になりました。

私の無駄な試みの中で、私は何か奇妙なものを見つけました。 listdependsの両方が実際にはrospackに渡される引数です。実際にrospackに電話すると、rospack helpに電話して利用可能な引数を確認するエラーが表示されます。

したがって、これらを分割して、["rospack", "list"]["rospack", "depends", "ros_package"]を2つのPOpenコールに渡しました。私の驚きのために私は得た

[rospack] Error: no command given. Try 'rospack help' [rospack]

[rospack] Error: no command given. Try 'rospack help'

少なくとも私にとっては、かなり奇妙な動作です。

答えて

3

これはPopenを実行する方法と混同しています。

ros_package_deps_retrieve = subprocess.Popen("rospack depends %s"rospack, shell=True, stdout=subprocess.PIPE) 

または完全に別のリストとして渡しをし、shell=False(デフォルトではなく、指定する必要)を使用します:あなたはshell=Trueで一つの文字列を渡す必要があるのいずれか

ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", rospack], stdout=subprocess.PIPE) 

こちらのドキュメントを参照してください。 :

https://docs.python.org/2/library/subprocess.html#popen-constructor

重要な部分は、(下記のドキュメントから関連する引用符です)

あなたがshell=Trueを渡し、['rospack', 'list']のようにそれを渡すときに、rospackコマンドなってしまう、とlistはあなたが何を望むか、シェルに引数ではありませんになります。

shell=Falseとし、それを['rospack depends', rosmodule]のように渡すと、文字列'rospack depends'が存在しないため実行できません。

関連する問題