¿Cómo llamar a un script Perl desde Python, canalizando la entrada a él?

Estoy pirateando parte del soporte para DomainKeys y DKIM en un progtwig de marketing de correo electrónico de código abierto, que utiliza un script de Python para enviar los correos electrónicos reales a través de SMTP. Decidí ir por la ruta rápida y sucia, y solo escribo un script en perl que acepta un mensaje de correo electrónico de STDIN, lo firma y luego lo devuelve firmado.

Lo que me gustaría hacer es desde el script de python, canalizar el texto del correo electrónico que está en una cadena al script de perl y almacenar el resultado en otra variable, por lo que puedo enviar el correo electrónico firmado. Sin embargo, no soy exactamente un gurú de Python, y parece que no puedo encontrar una buena manera de hacer esto. Estoy bastante seguro de que puedo usar algo como os.system para esto, pero canalizar una variable a la secuencia de comandos perl es algo que parece eludirme.

En resumen: ¿cómo puedo canalizar una variable desde un script de Python a un script de Perl y almacenar el resultado en Python?

EDITAR: Olvidé incluir que el sistema con el que estoy trabajando solo tiene Python v2.3

os.popen () devolverá una tupla con la entrada estándar y la salida estándar del subproceso.

Utilizar subproceso . Aquí está la secuencia de comandos de Python:

 #!/usr/bin/python import subprocess var = "world" pipe = subprocess.Popen(["./x.pl", var], stdout=subprocess.PIPE) result = pipe.stdout.read() print result 

Y aquí está el script de Perl:

 #!/usr/bin/perl use strict; use warnings; my $name = shift; print "Hello $name!\n"; 
 from subprocess import Popen, PIPE p = Popen(['./foo.pl'], stdin=PIPE, stdout=PIPE) p.stdin.write(the_input) p.stdin.close() the_output = p.stdout.read() 

“Estoy bastante seguro de que puedo usar algo como os.system para esto, pero canalizar una variable a la secuencia de comandos perl es algo que parece que me elude”.

Correcto. El módulo de subproceso es como os.system, pero proporciona las funciones de tuberías que está buscando.

Estoy seguro de que hay una razón por la que vas por la ruta que has elegido, pero ¿por qué no simplemente firmar en Python?

¿Cómo lo estás firmando? ¿Tal vez podríamos proporcionar algo de ayuda para escribir una implementación de python?

Intenté también hacer eso solo configurar cómo hacer que funcione como

 pipe = subprocess.Popen( ['someperlfile.perl', 'param(s)'], stdin=subprocess.PIPE ) response = pipe.communicate()[0] 

Deseo que esto te ayude a hacer que funcione.