6

我正在将一些对 DomainKeys 和 DKIM 的支持加入到一个开源电子邮件营销程序中,该程序使用 python 脚本通过 SMTP 发送实际电子邮件。我决定走一条快速而肮脏的路线,只写一个 perl 脚本,它接受来自 STDIN 的电子邮件,对其进行签名,然后将其返回签名。

我想做的是从 python 脚本,将字符串中的电子邮件文本通过管道传输到 perl 脚本,并将结果存储在另一个变量中,这样我就可以发送签名的电子邮件。但是,我并不完全是 python 大师,而且我似乎找不到一个好方法来做到这一点。我很确定我可以os.system为此使用类似的东西,但是将变量传递给 perl 脚本似乎让我难以理解。

简而言之:如何将变量从 python 脚本传输到 perl 脚本,并将结果存储在 Python 中?

编辑:我忘了包括我正在使用的系统只有 python v2.3

4

6 回答 6

11

使用子进程。这是 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";
于 2009-04-28T15:25:57.557 回答
9

os.popen()将返回一个带有子进程的标准输入和标准输出的元组。

于 2009-04-28T15:00:49.707 回答
7
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()
于 2009-04-28T15:12:26.043 回答
2

“我很确定我可以为此使用 os.system 之类的东西,但是将变量传递给 perl 脚本似乎让我难以理解。”

正确的。subprocess模块类似于os.system,但提供了您正在寻找的管道功能。

于 2009-04-28T15:01:48.160 回答
2

我敢肯定你选择的路线是有原因的,但为什么不直接用 Python 进行签名呢?

你怎么签的?也许我们可以在编写 python 实现方面提供一些帮助?

于 2009-04-28T15:18:12.303 回答
1

我也尝试这样做,只配置如何使其工作

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

我希望这将帮助你使它工作。

于 2013-02-05T09:34:12.780 回答