2016-05-28 5 views
0

Bit über das Setup und Ziel zuerst; Ich habe Core installiert und eine Sitzung ausgeführt, die ich ein paar Befehle aus einem Python-Skript ausführen möchte. Da es nur ein paar Befehle gibt und sie ziemlich einfache Befehle sind, dachte ich, ich würde einfach subprocess.Popen verwenden, um coresendmsg zu treten, anstatt zu versuchen, die Kernsteuerungsebene in meinem Skript zu implementieren.Skriptargumente wurden nicht korrekt analysiert, wenn das Skript von Popen() aufgerufen wurde

Ein Beispiel für den Befehl (von der CLI laufen) ist wie folgt:

coresendmsg exec node=2 num=1001 cmd='ifconfig eth0 192.168.0.1' 

ich mit der Ausführung dieses Befehls von Python hatte einige Probleme haben und mit coresendmsg richtig das cmd Argument analysieren. Wenn sie wie unten gezeigt ausgeführt wird, betrachtet coresendmsg eth0 und 192.168.0.1 als separate Argumente und Drosseln, was für mich sinnvoll ist.

s=subprocess.Popen(['coresendmsg', 
    'exec', 
    '-s 47854', 
    'node=2', 
    'num=1001', 
    'cmd=ifconfig eth0 192.168.0.1']) 

Wenn ich es dann auf die folgenden ändern, hält coresendmsg nun die cmd als ein einziges Argument, aber Drosseln noch, weil die einfachen Anführungszeichen jetzt enthalten sind, wenn die Argumente in coresendmsg aufgeteilt werden. Dies ist anders als wenn das coresendmsg von der Kommandozeile mit den gleichen Anführungszeichen ausgeführt wird, wie im obigen Beispiel gezeigt.

s=subprocess.Popen(['coresendmsg', 
    'exec', 
    '-s 47854', 
    'node=2', 
    'num=1001', 
    'cmd=\'ifconfig eth0 192.168.0.1\'']) 

Ich weiß dies, weil ich in Coresendmsg ging und änderte, um die Argumente zu drucken, und beide Fälle überprüft. Wenn der Befehl oben läuft von CLI, sehe ich:

['exec', 'node=2', 'num=1001', 'cmd=ifconfig eth0 192.168.0.1'] 

aber, wenn sie von Python laufen bekomme ich eine der folgenden je nachdem, wie ich die Dinge zitieren:

['exec', 'node=2', 'num=1001', 'cmd=ifconfig', 'eth0', '192.168.0.1'] 
['exec', 'node=2', 'num=1001', "cmd='ifconfig eth0 192.168.0.1'"] 
['exec', 'node=2', 'num=1001', 'cmd="ifconfig eth0 192.168.0.1"'] 

ich diese Arbeit machen kann aus ein Bash-Skript, aber ich würde lieber kein Skript ausführen, aus einem Skript, aus einem Skript. Suchen Sie nach Vorschlägen, die dieses Problem beheben könnten.

+2

Ich bemerkte, Sie haben ''s 47854''. Versuchen Sie, das in "-s", "47854" zu ändern –

Antwort

1

Um zu klären, was @HaiVu sagt, schlägt Ihr erstes Beispiel wegen -s 47854, nicht der cmd Parameter fehl. In Ihrem Beispiel wurde ein einzelner Parameter von "-s 47854" übergeben. Abhängig davon, wie Argumente im Programm analysiert werden, könnte es node=2 als Wert für die -s dauern.

Da Sie eine Liste verwenden, Leerzeichen trennen Argumente nicht, so:

s=subprocess.Popen(['coresendmsg', 
    'exec', 
    '-s', '47854', 
    'node=2', 
    'num=1001', 
    'cmd=ifconfig eth0 192.168.0.1']) 

Ihre Experimente mit der Quotierung Unterschiede zu erwarten sind. Wenn Sie von einer Shell ("Befehlszeile") starten, entfernt die Shell die Anführungszeichen. Das Ausführen von Python streift auch Zitate ab, wenn Sie darüber nachdenken. Wenn Sie Zitate umgehen, werden sie direkt übergeben, sowohl in Python als auch in bash.

Wenn Sie zusätzliches Shell-Verhalten benötigen, verwenden Sie shell=True Parameter zu Popen. In diesem Fall ist das nicht erforderlich und kann in den meisten Fällen vermieden werden.

Verwandte Themen