如何在Python中调用一个Perl函数

11 人关注

我有几个写在Perl模块中的函数。我必须在Python中调用这些函数并获得输出。

我已经看到了这个链接 http://en.wikibooks.org/wiki/Python_Programming/Extending_with_Perl .我无法找到他们在Python中导入的Perl模块。

当我试图在Linux中安装pyperl时,它无法找到它。

我能够运行简单的Perl脚本并获得输出,但我无法调用用Perl编写的函数并获得输出。

5 个评论
你需要访问perl中的哪个函数?
你是如何尝试安装的?
我试着从新安装了一个 search.cpan.org/dist/pyperl 但它在Ubuntu上也失败了...如果只是一个单一的函数,在python中找到相应的函数不是更容易吗?
@alvas 并不惊讶,我个人会避免安装一个在文档中提到python1.5并且不再维护的lib。
替换代码0】对于在Perl中嵌入Python相当有效,但反过来说,目前似乎并不实用。
python
perl
Jack
Jack
发布于 2014-01-19
3 个回答
user4815162342
user4815162342
发布于 2019-10-11
已采纳
0 人赞同

使用 popen 来运行Perl解释器并执行所需代码。当运行Perl时,包括 -m MODULE 开关来加载所需的模块和 -e EXPRESSION 来执行你想要的函数。例如,这段代码运行 POSIX 模块中的一个函数,并获得其(字符串)结果。

>>> os.popen('''
... perl -mPOSIX -e "print POSIX::asctime(localtime)"
... ''').read()
'Sun Jan 19 12:14:50 2014\n'

如果你需要在Python和Perl之间传输更多的数据结构,请使用一种两种语言都支持的中间格式,比如JSON。

>>> import os, json
>>> json.load(os.popen('''
... perl -e '
...   use POSIX qw(localtime asctime);
...   use JSON qw(to_json);
...   my @localtime = localtime(time);
...   print to_json({localtime => \@localtime,
...                  asctime => asctime(@localtime)});
... '
... '''))
{u'localtime': [10, 32, 12, 19, 0, 114, 0, 18, 0],
 u'asctime': u'Sun Jan 19 12:32:10 2014\n'}
    
Down the Stream
Down the Stream
发布于 2019-10-11
0 人赞同

今天正在做类似的事情,使用一个名为 perlfunc.py 的模块在 http://www.boriel.com/files/perlfunc.py .

Tested on:

  • Python 2.7.12
  • perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi
  • Did tiny fine-tuning on perlfunc.py:

  • raise RuntimeError(a.communicate()[1]) (line 41)
  • removed 'defined' from line 132
  • very_old.pl :

    #!/usr/bin/perl
    sub hello($)
       my $d = shift;
       return "Hello, $d!";
    

    reuse_very_old_perl_sub.py:

    #!/usr/bin/python
    from perlfunc import perlfunc, perlreq, perl5lib
    @perlfunc
    @perlreq('very_old.pl')
    def hello(somebody):
    if __name__ == '__main__':
        assert(hello('python-visit-perl') == 'Hello, python-visit-perl!')
        
    谢谢你,jwodder,对内容进行了格式化:现在看起来容易多了。
    我是那个小片段的作者。最近我更新了它,使其与Python 2.7.x和Python3兼容。欢迎与我联系以改进它。)它现在在github上。 github.com/boriel/perlfunc
    Peter V. Mørch
    Peter V. Mørch
    发布于 2019-10-11
    0 人赞同

    From Presenting PyPerler ( github ):

    I spent some spare time writing a Python -> Perl interface. The existing solution pyperl 原本是为非常老的版本 编写的,现在已经不能编译了。同时,由于Cython的出现,编写C 扩展变得更容易了,这要感谢 Cython。I 认为从头开始写PyPerler是有意义的。I 幸好使用了PyPerl的Perl代码来包装一个Python 对象。在Python方面,一切都很新。

    PyPerler为你提供了CPAN的力量,以及你的(传统的)perl 包,在 Python 中。使用Perl的东西就像这样简单。

    >>> import pyperler; i = pyperler.Interpreter()
    >>> # use a CPAN module
    >>> Table = i.use('Text::Table')
    >>> t = Table("Planet", "Radius\nkm", "Density\ng/cm^3")
    >>> _ = t.load(
    ...    [ "Mercury", 2360, 3.7 ],
    ...    [ "Venus", 6110, 5.1 ],
    ...    [ "Earth", 6378, 5.52 ],
    ...    [ "Jupiter", 71030, 1.3 ],
    ... )
    >>> for line in t.table(): print line
    Planet  Radius Density
            km     g/cm^3 
    Mercury  2360  3.7    
    Venus    6110  5.1