2009-04-28 15 views
6

Estoy pirateando algo de compatibilidad con DomainKeys y DKIM en un programa de marketing por correo electrónico de código abierto, que utiliza una secuencia de comandos python para enviar los correos electrónicos reales a través de SMTP. Decidí ir por la ruta rápida y sucia, y simplemente escribir un script de Perl que acepte un mensaje de correo electrónico de STDIN, lo firme y luego lo devuelva firmado.Cómo llamar a un script de Perl desde Python, ingresando la entrada de la tubería?

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

En resumen: ¿Cómo puedo tubería de una variable de un script en Python, a un script en perl, y almacenar el resultado en Python?

EDIT: se me olvidó incluir que el sistema que estoy trabajando con un solo pitón tiene v2.3

Respuesta

9

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

+6

popen ha quedado obsoleto desde la versión 2.6, debe utilizar subproceso lugar. –

+1

-1: obsoleto. Use el módulo de subproceso. – nosklo

+3

De la pregunta: "only has python v2.3" obsoleta todavía no ha sucedido. –

2

"Estoy bastante seguro de que puedo usar algo como os.system para esto, pero tuberías de una variable en el script Perl es algo que me parece eludir".

correcta. El módulo subprocess es como el sistema os.system, pero proporciona las características de tuberías que está buscando.

+0

Debería haber aclarado que solo estoy trabajando con Python 2.3, y parece que el módulo de subproceso es para 2.4 y superior. –

+0

@Alex Fort: Simplemente tome el módulo de subproceso desde 2.4 y ejecútelo en 2.3. Parece funcionar. – nosklo

6
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() 
2

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

¿Cómo estás firmarlo? ¿Tal vez podríamos proporcionar algo de ayuda al escribir una implementación de Python?

+0

I * haría * la firma de python, pero mi python-fu es bastante débil. Sin embargo, esa sería una solución más óptima, por lo que podría considerarlo en el futuro, especialmente si decido aportar el código a la comunidad. –

+0

Si publica la solución Perl en algún lugar, me gustaría ayudarlo a convertirla :-) –

+0

La solución Perl es realmente simple. Solo estoy aprovechando el módulo Mail :: DKIM, lo que hace que firmar un correo electrónico sea bastante trivial. –

10

Uso subprocess. 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"; 
+0

De acuerdo con la pregunta, la secuencia de comandos de Perl debe aceptar entrada, no una arg. – ngn

1

Probé también para hacer que sólo configurar cómo hacer que funcione como

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

Deseo esto te ayudará a hacer que funcione.

Cuestiones relacionadas