2011-01-13 6 views
9

Ich habe ein Perl-Skript, das ich von einem Python-Skript aufrufen möchte. Ich habe überall nachgesehen und war nicht erfolgreich. Ich versuche im Grunde, das Perl-Skript aufzurufen, das 1 Variable zu ihm sendet, aber die Ausgabe des Perl-Skripts nicht benötigt, da es ein eigenständiges Programm ist.Call Perl-Skript von Python

Was ich mit so habe kommen weit ist:

var = "/some/file/path/" 
pipe = subprocess.Popen(["./uireplace.pl", var], stdin=subprocess.PIPE) 
pipe.stdin.write(var) 
pipe.stdin.close() 

gerade erst begonnen Python-Programmierung, so dass ich bin sicher, dass die oben totaler Unsinn ist. Jede Hilfe würde sehr geschätzt werden.

Antwort

7

Wenn Sie nur ein Rohr mit einem Perl-Interpreter öffnen mögen, du bist Auf dem richtigen Weg. Das einzige, was ich vermisse, ist, dass das Perl-Skript selbst keine ausführbare Datei ist. Also müssen Sie dies tun:

+0

der '. /' Teil im Skript-Aufruf ist nutzlos und ich kann nicht die Verwendung der beiden letzten Zeile sehen, und diese zwei letzten Zeile kann zu Bugs führen !! – mouad

+0

Wenn Sie absoluten Pfad und perl ausführbare Datei angeben, wird ./ nicht verwendet. –

1

Ich hoffe, this kann Ihnen helfen. Ich weiß nicht, wie ich das sonst machen soll.

+0

danke für die Referenz ... es wurde erstellt und unterstützt von activestate .. sie scheint es fallen gelassen? – Tagar

1

Möchten Sie var als Parameter, auf stdin oder beides übergeben? Um es als Parameter übergeben, verwenden

subprocess.call(["./uireplace.pl", var]) 

an Rohr es stdin verwenden

pipe = subprocess.Popen("./uireplace.pl", stdin=subprocess.PIPE) 
pipe.communicate(var) 

Beide Codefragmente uireplace.pl erfordern ausführbar zu sein. Wenn dies nicht der Fall, können Sie

pipe = subprocess.Popen(["perl", "./uireplace.pl"], stdin=subprocess.PIPE) 
pipe.communicate(var) 
2

verwenden Sie könnten die subprocess.call() Methode versuchen. Es gibt keine Ausgabe von dem Befehl zurück, den Sie aufrufen, sondern den Rückgabecode, um anzuzeigen, ob die Ausführung erfolgreich war.

var = "/some/file/path" 
retcode = subprocess.call(["./uireplace.pl", var]) 
if retcode == 0: 
    print("Passed!") 
else: 
    print("Failed!") 

Stellen Sie sicher, dass Sie Perl-Skript ausführbar ist. Andernfalls können Sie die Perl-Interpreter in Ihrem Befehl (so etwas wie diese) schließen ein:

subprocess.call(["/usr/bin/perl", "./uireplace.pl", var]) 
15

Just do:

var = "/some/file/path/" 
pipe = subprocess.Popen(["perl", "uireplace.pl", var]) 
+1

Nur ein Hinweis: Da das OP sagt, er will nicht die Ausgabe zu bekommen, ist 'Popen' nicht erforderlich. Die Verwendung von 'subprocess.call' oder' subprocess.check_call' ist besser. – user225312

+3

@sukhbir: ich denke, wenn das OP sagt, dass er die Ausgabe nicht braucht, kann ich auch "annehmen", dass er auch nicht warten will, bis das Perl-Skript beendet, was "subprocess.call" oder "subprocess. check_call' does :) – mouad

+0

Ein gültiger Punkt, +1. – user225312