Как вызвать 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]

Я хотел бы, чтобы это помогло вам заставить это работать.

Другие вопросы по тегам