Как вызвать Perl-скрипт из Python, передавая входные данные в него? - PullRequest
6 голосов
/ 28 апреля 2009

Я взламываю некоторую поддержку DomainKeys и DKIM в почтовой маркетинговой программе с открытым исходным кодом, которая использует скрипт python для отправки реальных писем через SMTP. Я решил пойти быстрым и грязным путем и просто написать Perl-скрипт, который принимает сообщение электронной почты от STDIN, подписывает его, а затем возвращает его подписанным.

То, что я хотел бы сделать, это из скрипта python, передать текст электронной почты, который находится в строке, в скрипт perl, и сохранить результат в другой переменной, чтобы я мог отправить письмо со знаком. Однако я не совсем гуру питона, и я не могу найти хороший способ сделать это. Я почти уверен, что могу использовать что-то вроде os.system для этого, но передача переменной в скрипт perl, кажется, ускользает от меня.

Вкратце: как я могу передать переменную из скрипта Python в скрипт Perl и сохранить результат в Python?

РЕДАКТИРОВАТЬ: я забыл включить, что система, с которой я работаю, имеет Python v2.3

Ответы [ 6 ]

10 голосов
/ 28 апреля 2009

Использовать подпроцесс . Вот скрипт 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";
9 голосов
/ 28 апреля 2009

os.popen () вернет кортеж со стандартным вводом и выводом подпроцесса.

7 голосов
/ 28 апреля 2009
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 голосов
/ 28 апреля 2009

Я уверен, что есть причина, по которой вы идете по выбранному вами маршруту, но почему бы просто не выполнить подпись в Python?

Как ты это подписываешь? Может быть, мы могли бы помочь в написании реализации на Python?

2 голосов
/ 28 апреля 2009

«Я почти уверен, что могу использовать что-то вроде os.system для этого, но передача переменной в скрипт perl, кажется, ускользает от меня».

Правильно. Модуль подпроцесса похож на os.system, но предоставляет необходимые функции трубопровода.

1 голос
/ 05 февраля 2013

Я также пытался сделать это, чтобы настроить только как

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

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

...