【问题标题】:How to call a Perl script from Python, piping input to it?如何从 Python 调用 Perl 脚本,通过管道输入?
【发布时间】:2010-10-22 08:31:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python perl domainkeys dkim


    【解决方案1】:

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

    【讨论】:

    • 根据问题,Perl 脚本应该接受输入,而不是 arg。
    【解决方案2】:

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

    【讨论】:

    • popen 自 2.6 版以来已被弃用,您应该改用 subprocess。
    • 来自问题:“只有python v2.3”尚未弃用。
    • 这很好用。我最终使用了 popen2,打开了一个输入和输出,这就像一个魅力。感谢您的帮助。
    【解决方案3】:
    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()
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我应该澄清一下,我只使用 python 2.3,而且似乎 subprocess 模块适用于 2.4 及更高版本。
      • @Alex Fort:只需从 2.4 中获取 subprocess 模块并在 2.3 上运行它。它似乎有效。
      【解决方案5】:

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

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

      【讨论】:

      • 从 python 进行签名,但我的 python-fu 很弱。然而,这将是一个更理想的解决方案,所以我可能会考虑在未来,特别是如果我决定将代码贡献给社区。​​span>
      • 如果您将 Perl 解决方案发布到某个地方,我很乐意帮助您尝试转换它 :-)
      • Perl 解决方案非常简单。我只是在利用 Mail::DKIM 模块,这使得签署电子邮件变得非常简单。
      • 所以这样的事情应该使 Python 实现同样简单:hewgill.com/pydkim :-)
      • ...啊,除了它需要 Python >= 2.5 ...老鼠!出于好奇,您为什么仍在使用 2.3 而不是更新的版本?
      【解决方案6】:

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

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

      我希望这能帮助你完成它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        相关资源
        最近更新 更多