Как вызвать Perl-скрипт из Python, передавая входные данные в него?
Я взламываю некоторую поддержку DomainKeys и DKIM в почтовой маркетинговой программе с открытым исходным кодом, которая использует скрипт Python для отправки реальных писем через SMTP. Я решил пойти быстрым и грязным путем и просто написать Perl-скрипт, который принимает сообщение электронной почты от STDIN, подписывает его, а затем возвращает его подписанным.
То, что я хотел бы сделать, это из скрипта python, передать текст электронной почты, который находится в строке, в скрипт perl, и сохранить результат в другой переменной, чтобы я мог отправить письмо с подписью. Однако я не совсем гуру питона, и я не могу найти хороший способ сделать это. Я уверен, что могу использовать что-то вроде os.system
для этого, но передача переменной в скрипт perl, кажется, ускользает от меня.
Вкратце: как я могу передать переменную из скрипта Python в скрипт Perl и сохранить результат в Python?
РЕДАКТИРОВАТЬ: я забыл включить, что система, с которой я работаю, имеет Python v2.3
6 ответов
os.popen() вернет кортеж со стандартным вводом и выводом подпроцесса.
Используйте подпроцесс. Вот скрипт Python:
#!/usr/bin/python
import subprocess
var = "world"
pipe = subprocess.Popen(["./x.pl", var], stdout=subprocess.PIPE)
result = pipe.stdout.read()
print result
А вот и скрипт 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()
"Я почти уверен, что могу использовать что-то вроде os.system для этого, но передача переменной в сценарий perl, кажется, ускользает от меня".
Правильный. Модуль подпроцесса похож на os.system, но предоставляет необходимые функции трубопровода.
Я уверен, что есть причина, по которой вы идете по выбранному вами маршруту, но почему бы просто не подписаться на Python?
Как вы подписываете это? Может быть, мы могли бы помочь в написании реализации на Python?
Я пытался также сделать это только настроить, как заставить его работать как
pipe = subprocess.Popen(
['someperlfile.perl', 'param(s)'],
stdin=subprocess.PIPE
)
response = pipe.communicate()[0]
Я хотел бы, чтобы это помогло вам заставить это работать.