2017-08-17 4 views
0

Ich bin gerade dabei, ein allgemeines Konfigurationstool für ROS (Robot Operating System) zu erstellen. Mit subprocess.POpen() und Tkinter Ich erstelle eine treeview wie folgt aus:Argument kann nicht an Subprozess übergeben werden mit POpen

enter image description here

Die ersten beiden Spalten sind ziemlich einfach durch die saubere Art und Weise zu erstellen rospack list (ein Befehl, der alle Pakete aufgelistet, die auf dem System installiert sind diejenigen umfasst, die innerhalb des jeweiligen Arbeitsbereich, wo der Entwickler seine eigenen Pakete erzeugt) funktioniert:

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) 

die Benötigt Spalte ist die knifflige Frage, da ein Problem Witz h ruft rospack depends <package> (listet (falls vorhanden) alle Pakete die <package> erfordert auf dem System vorhanden sein, um zu bauen und/oder zu laufen). Für jedes Paket, das in ros_packages_installed ich die folgende Funktion aufrufen, ist:

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 

Das Problem ist, dass ich immer

[rospack] Error: no package given

und der Rückgabewert ist immer eine leere Liste. Ich habe sogar versucht, das ros_package Argument mit dem Befehl selbst zu verketten, aber alles umsonst.

Während meiner vergeblichen Versuche fand ich etwas ziemlich Seltsames. Sowohl list als auch sind tatsächlich Argumente, die an rospack übergeben werden. Wenn Sie nur rospack anrufen, erhalten Sie eine Fehlermeldung, dass Sie rospack help aufrufen müssen, um die verfügbaren Argumente zu sehen.

Deshalb habe ich versucht, diese Dinge aufzuteilen und ["rospack", "list"] und ["rospack", "depends", "ros_package"] an die zwei POpen Anrufe übergeben. Für meine Überraschung habe ich

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

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

die zumindest für mich ist ein eher seltsames Verhalten.

Antwort

3

Dies ist eine Verwechslung mit dem Ausführen von Popen. Sie sollten entweder eine einzelne Zeichenfolge mit shell=True passieren:

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

oder als vollständig separate Liste übergeben, und verwenden Sie shell=False (die Standardeinstellung angeben nicht erforderlich):

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

der Dokumentation finden Sie hier : https://docs.python.org/2/library/subprocess.html#popen-constructor

Wichtige Teile (sind unten in den Dokumenten relevant Anführungszeichen):

If shell is True, it is recommended to pass args as a string rather than as a sequence. ...

If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself.

Also, wenn Sie shell=True passieren und geben es wie ['rospack', 'list'] endet rospack der Befehl wird nach oben und list wird ein Argument für den Shell, nicht das, was Sie wollten.

Wenn shell=False und Sie es wie ['rospack depends', rosmodule] übergeben, macht das die Zeichenfolge 'rospack depends' den Befehl auszuführen, der nicht existiert und daher fehlschlägt.

Verwandte Themen