2011-01-13 15 views
9

Ho uno script Perl che voglio richiamare da uno script Python. Ho cercato dappertutto e non ho avuto successo. Fondamentalmente sto provando a chiamare lo script Perl inviando 1 variabile, ma non ho bisogno dell'output dello script Perl, in quanto è un programma autonomo.Chiama Perl script da Python

Quello che è venuta in mente finora è:

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

appena iniziato di programmazione Python, quindi sono sicuro che quanto sopra è una sciocchezza totale. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

7

Se si desidera solo per aprire una pipe ad un interprete Perl, sei sulla pista giusta. L'unica cosa che penso manchi è che lo script perl non è un eseguibile. Quindi hai bisogno di fare questo:

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

la parte '. /' Nella chiamata allo script è inutile e non riesco a vedere l'uso delle ultime due righe e questa ultima riga può portare a bug !! – mouad

+0

Se si sta fornendo un percorso assoluto e un eseguibile perl, allora ./ non è in uso. –

1

I Hope this può aiutarti. Non so come farlo altrimenti.

+0

grazie per il riferimento ... è stato creato e supportato da activestate .. sembra caduto? – Tagar

1

Si desidera passare var come parametro, su stdin o entrambi? Per passare come parametro, utilizzare

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

di pipe a stdin, utilizzare

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

Entrambi i frammenti di codice richiedono uireplace.pl essere eseguibile. Se non lo è, è possibile utilizzare

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

Si potrebbe provare il metodo subprocess.call(). Non restituirà l'output dal comando che stai invocando, ma piuttosto il codice di ritorno per indicare se l'esecuzione ha avuto successo.

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

Assicurarsi che lo script Perl sia eseguibile. In caso contrario, è possibile includere l'interprete Perl nel comando (qualcosa di simile):

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

Basta fare:

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

Solo una nota: poiché l'OP dice che non vuole ottenere l'output, 'Popen' non è richiesto. Usare 'subprocess.call' o' subprocess.check_call' è meglio. – user225312

+3

@sukhbir: penso che quando l'OP dice che non ha bisogno dell'output, posso anche "supporre" che anche lui non voglia aspettare fino a che lo script perl non completi quale cosa 'subprocess.call' o 'sottoprocesso'. check_call' fa :) – mouad

+0

Un punto valido, infatti, +1. – user225312