如何从Python调用Perl脚本并传递输入?

6 投票
6 回答
14093 浏览
提问于 2025-04-15 11:17

我正在为一个开源的邮件营销程序添加对DomainKeys和DKIM的支持,这个程序使用Python脚本通过SMTP发送实际的邮件。我决定走个快速又简单的路线,写一个Perl脚本,它可以从标准输入接收邮件内容,给邮件签名,然后返回签名后的邮件。

我想做的是,从Python脚本中把邮件内容(以字符串形式)传给这个Perl脚本,然后把结果存储在另一个变量里,这样我就可以发送签名后的邮件了。不过,我对Python不是特别精通,找不到一个好的方法来实现这个。我觉得可以用类似os.system的东西来做到这一点,但把一个变量传给Perl脚本的方式我还没搞明白。

简单来说:我该如何把一个变量从Python脚本传给Perl脚本,并把结果存储在Python中呢?

补充说明:我忘了提,我正在使用的系统只有Python v2.3。

6 个回答

7

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个功能时,发现它的表现和预期的不一样。这种情况很常见,尤其是在我们还不太熟悉这些工具的细节时。

在这种情况下,查看相关的文档或者在网上搜索解决方案是一个不错的选择。很多时候,其他人也遇到过类似的问题,他们可能已经分享了解决办法或者经验。这就是为什么像StackOverflow这样的社区非常有帮助,因为你可以找到很多有用的信息和建议。

总之,遇到问题时,不要气馁,尝试去寻找答案,学习更多的知识,这样你会逐渐变得更加熟练。

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()
11

使用 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";
9

os.popen() 这个函数会返回一个元组,里面包含了子进程的输入和输出。

撰写回答