如何从Python调用Perl脚本,输入到它?

时间:2009-04-28 14:58:34

标签: python perl domainkeys dkim

我正在攻击DomainKeys和DKIM对开源电子邮件营销程序的一些支持,该程序使用python脚本通过SMTP发送实际的电子邮件。我决定采用快速而肮脏的路线,只需编写一个perl脚本,接受来自STDIN的电子邮件,签名,然后将其签名。

我想做的是,从python脚本中,将字符串中的电子邮件文本传递给perl脚本,并将结果存储在另一个变量中,这样我就可以发送已签名的电子邮件。然而,我并不是一个蟒蛇大师,我似乎无法找到一个很好的方法来做到这一点。我很确定我可以使用os.system这样的东西,但是将一个变量传递给perl脚本似乎是我无法实现的。

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

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

6 个答案:

答案 0 :(得分:10)

使用subprocess。这是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";

答案 1 :(得分:9)

os.popen()将返回一个带有子进程的stdin和stdout的元组。

答案 2 :(得分: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()

答案 3 :(得分:2)

“我很确定我可以使用像os.system这样的东西,但是将一个变量传递给perl脚本似乎是我无法实现的。”

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

答案 4 :(得分:2)

我确信你选择的路线是正确的,但为什么不用Python进行签名?

你是如何签名的?也许我们可以在编写python实现时提供一些帮助?

答案 5 :(得分:1)

我还试图这样做只配置如何使其工作

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

我希望这能帮助你使它发挥作用。