Frage

Zum ersten Mal ist ich ein wenig Hilfe zu bitten hier, wie ich bin eher eine ServerFault Person.

Ich bin etwas scripting in Python zu tun, und ich habe die Sprache wurde liebend bisher noch ich habe dieses kleine Problem, das mein Skript hält von der Arbeit.

Dies ist die Codezeile in Frage:

subprocess.call('xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd',shell=True)

Ich habe die gleiche Sache mit os.popen versucht. Alle werden die Variablen richtig eingestellt ist.

Wenn ich den Befehl in Frage in meinem normal Linux-Shell ausführen, funktioniert es völlig in Ordnung, aber wenn ich es ausführen meinen Python-Skripte verwenden, ich bizarre Fehler bekommen. Ich habe sogar ersetzt subprocess.call () durch die Druckfunktion sicherstellen, dass ich die genaue Ausgabe des Befehls verwenden.

Ich ging in den Umgebungsvariablen meines Shell suchen, aber sie sind so ziemlich das gleiche ... Ich werde den Fehler poste ich immer bin, aber ich bin nicht sicher, es ist relevant für mein Problem.

Die Verwendung von nicht initialisierten Wert $ Linien [0] in Substitution (en ///) bei /usr/share/perl5/Config/IniFiles.pm Linie 614. Die Verwendung von nicht initialisierten Wert $ _ in Mustererkennung (m //) bei /usr/share/perl5/Config/IniFiles.pm Linie 628.

Ich bin kein Experte Python so dass ich wahrscheinlich hier etwas fehlt.

Vielen Dank im Voraus für Ihre Hilfe,

Antoine


Bearbeiten

miax Rat Nach hörte ich mit Hilfe von Shell = True. Stattdessen nahm ich einen Blick in die Dokumentation Python für subprocess und verwendet, um das folgende Stück Code :

cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd'
args = shlex.split(cmd)
subprocess.call(args)

Leider ist es ändert nichts ...


EDIT2

ich die Spitze von miax gegeben verwendet habe, aber ich habe noch die obige Fehlermeldung erhalten ... Hier ist der Code, dass ich verwendet habe.

cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd']
subprocess.call(cmd)

Das ist wirklich seltsam ... Der genaue Befehl funktioniert gut, wenn ich es in der regulären Shell ausgeführt ...

War es hilfreich?

Lösung

Hat das xen-create-image Skript mit einem Hash-Bang starten? Das heißt, die erste Zeile so etwas wie

#!/bin/sh

? Das ist eine Sache zu überprüfen. Ein weiterer Grund ist, dass Sie versuchen können, Ihren Befehl zu nennen:

cmd = ['/bin/sh', '-c', 'xen-create-image --hostname %s --memory %s --partitions=/root/scripts/part.tmp --ip %s --netmask %s --gateway %s --passwd' % (nom, memory, ip, netmask, gateway)]
subprocess.call(cmd, shell=False)

Sie möchten vielleicht cmd drucken, um zu überprüfen ist dies der Befehl, den Sie ausführen möchten (das heißt die Ersetzungen überprüfen).

Andere Tipps

Sie (in den meisten Fällen) nicht wollen, zu verwenden subprocess mit shell=True. Führen Sie eine Liste von Argumenten für den Befehl. Das heißt

  • sicherer. Stellen Sie sich einen Benutzer foo; rm -rf /; echo wie einige der Werte übergeben verwaltet
  • zuverlässig. Stellen Sie sich vor einer der Saiten ein $ oder etwas enthält - es wird durch den Inhalt dieser Umgebungsvariablen durch die Schale und ersetzt erweitert werden

Ohne Ihren Code und xen-create-image zu wissen, gehe ich davon aus, dass die Ursache des Problems ist.

PS: Achten Sie darauf, zu sehen, ob der Exit-Code des Befehls gleich Null ist, und handelt entsprechend, wenn nicht. (Wenn Sie sicher sind, dass es immer Null sein wird, verwenden check_call, die wirft, wenn dies nicht der Fall;. Sie können zumindest ein definiertes Verhalten haben werden, wenn es fehlschlägt)

EDIT2 Beispiel, das Sie versagt, denken Sie folgende Optionen zur xen-create-image geben:

  • --hostname
  • --memory
  • --partitions=...
  • etc

... aber Sie sind die folgenden Optionen tatsächlich Angabe:

  • --hostname Raum
  • Raum --memory Raum
  • Raum --partitions=...
  • etc

Sie haben die folgende Zeile:

cmd = ['xen-create-image', '--hostname ', nom, ' --memory ', memory, ' --partitions=/root/scripts/part.tmp', ' --ip ', ip, ' --netmask ', netmask, ' --gateway ', gateway, ' --passwd']

Aber Sie müssen die zusätzlichen Räume nehmen:

cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd']

Sie müssen den Befehl print Sie verwenden:

cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd'
print "COMMAND:", cmd

Und dann den Befehl in der Shell einfügen sicherzustellen, dass es genau das gleiche ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top