2011-01-13 10 views
9

Tengo un script Perl que quiero invocar desde un script Python. He estado buscando por todas partes, y no he tenido éxito. Básicamente trato de llamar al script de Perl que le envía 1 variable, pero no necesito el resultado del script de Perl, ya que es un programa independiente.Script Call Perl de Python

Lo que he encontrado hasta el momento es:

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

más que comenzar de programación Python, así que estoy seguro de que el anterior es absurdo total. Cualquier ayuda sería muy apreciada.

Respuesta

7

Si lo que desea es abrir una tubería a un intérprete de Perl, eres en el camino correcto. Lo único que creo que te estás perdiendo es que el script Perl en sí no es un ejecutable. Entonces necesita hacer esto:

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

la parte '. /' De la llamada al guion es inútil y no puedo ver el uso de las dos últimas líneas, ¡¡¡y estas dos últimas líneas pueden dar lugar a errores !! – mouad

+0

Si proporciona la ruta absoluta y el ejecutable perl, entonces ./ no está en uso. –

1

Espero que this lo pueda ayudar. No sé cómo hacer eso de lo contrario.

+0

gracias por la referencia ... fue creado y soportado por activestate .. parece que lo dejó? – Tagar

1

¿Desea pasar var como parámetro, en stdin o en ambos? Para pasar como un parámetro, utilice

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

a la tubería a la entrada estándar, utilice

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

Ambos fragmentos de código requieren uireplace.pl ser ejecutable. Si no es así, puede utilizar

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

puede probar con el método subprocess.call(). No devolverá el resultado del comando que está invocando, sino el código de retorno para indicar si la ejecución fue exitosa.

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

Asegúrate de que el script de Perl es ejecutable. De lo contrario, puede incluir el intérprete de Perl en su comando (algo así):

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

Sólo haz:

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

Solo una nota: dado que OP dice que no quiere obtener la salida, 'Popen' no es necesario. Usar 'subprocess.call' o' subprocess.check_call' es mejor. – user225312

+3

@sukhbir: creo que cuando el OP dice que no necesita la salida, también puedo "asumir" que él tampoco quiere esperar hasta que termine la secuencia de comandos perl, qué subproceso 'caducar 'o' subprocesar'. check_call' does :) – mouad

+0

Un punto válido, de hecho, +1. – user225312

Cuestiones relacionadas