2009-04-28 15 views
6

Sto hackerando un supporto per DomainKeys e DKIM in un programma di email marketing open source, che utilizza uno script python per inviare le e-mail effettive via SMTP. Ho deciso di seguire il percorso veloce e sporco, e ho appena scritto uno script perl che accetta un messaggio e-mail da STDIN, lo firma e lo restituisce firmato.Come chiamare uno script Perl da Python, l'input per piping ad esso?

Quello che mi piacerebbe fare, è dallo script python, inserire il testo dell'email in una stringa nello script perl e archiviare il risultato in un'altra variabile, così posso inviare l'e-mail firmata. Tuttavia, non sono esattamente un guru pitone e non riesco a trovare un buon modo per farlo. Sono abbastanza sicuro di poter usare qualcosa come os.system per questo, ma il piping di una variabile allo script perl è qualcosa che sembra sfuggirmi.

In breve: come è possibile reindirizzare una variabile da uno script python a uno script perl e archiviare il risultato in Python?

EDIT: Ho dimenticato di includere il sistema con cui sto lavorando ha solo pitone v2.3

risposta

9

os.popen() restituirà una tupla con stdin e stdout del sottoprocesso.

+6

popen è stato deprecato dalla versione 2.6, è invece necessario utilizzare il sottoprocesso. –

+1

-1: deprecato. Usa il modulo subprocess. – nosklo

+3

Dalla domanda: "solo ha python v2.3" deprecato non è ancora successo. –

2

"Sono abbastanza sicuro di poter utilizzare qualcosa come os.system per questo, ma il piping di una variabile allo script perl è qualcosa che sembra sfuggirmi."

Corretto. Il modulo subprocess è come os.system, ma fornisce le funzionalità di piping che stai cercando.

+0

Avrei dovuto chiarire che sto solo lavorando con python 2.3, e sembra che il modulo subprocess sia per 2.4 e versioni successive. –

+0

@Alex Fort: basta prendere il modulo del sottoprocesso da 2.4 ed eseguirlo su 2.3. Sembra funzionare. – 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

Sono sicuro che c'è un motivo per cui stai percorrendo il percorso che hai scelto, ma perché non limitarti a firmare in Python?

Come lo si firma? Forse potremmo fornire qualche assenso nella scrittura di un'implementazione python?

+0

I * farebbe * la firma da python, ma il mio python-fu è piuttosto debole. Sarebbe tuttavia una soluzione più ottimale, quindi potrei considerarlo in futuro, soprattutto se deciderò di fornire il codice alla comunità. –

+0

Se pubblichi la soluzione Perl da qualche parte, sarei felice di aiutarti a provare e convertirlo :-) –

+0

La soluzione Perl è davvero semplice. Sto solo sfruttando il modulo Mail :: DKIM, che rende la firma di un'e-mail piuttosto banale. –

10

Utilizzare subprocess. Ecco lo script Python:

#!/usr/bin/python 

import subprocess 

var = "world" 

pipe = subprocess.Popen(["./x.pl", var], stdout=subprocess.PIPE) 

result = pipe.stdout.read() 

print result 

E qui è lo script Perl:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $name = shift; 

print "Hello $name!\n"; 
+0

Secondo la domanda, lo script Perl dovrebbe accettare input, non un arg. – ngn

1

ho provato anche a che fare che solo configurare come farlo funzionare come

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

Auguro questo ti aiuterà a farlo funzionare.