如何在Python中调用Perl函数

时间:2014-01-19 07:59:39

标签: python perl

我在Perl模块中编写了一些函数。我必须在Python中调用这些函数并获取输出。

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

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

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

3 个答案:

答案 0 :(得分:5)

使用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'}

答案 1 :(得分:0)

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

经过测试:

  • Python 2.7.12
  • perl 5,版本22,颠覆1(v5.22.1)为x86_64-linux-gnu-thread-multi
  • 构建

对perlfunc.py进行了微小的微调:

  • raise RuntimeError(a.communicate()[1])(第41行)
  • 从第132行删除'已定义'

very_old.pl

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

1;

reuse_very_old_perl_sub.py

#!/usr/bin/python
from perlfunc import perlfunc, perlreq, perl5lib

@perlfunc
@perlreq('very_old.pl')
def hello(somebody):
    pass


if __name__ == '__main__':
    assert(hello('python-visit-perl') == 'Hello, python-visit-perl!')

答案 2 :(得分:0)

来自Presenting PyPerlergithub):

  

我花了一些业余时间编写Python-> Perl接口。的   现有解决方案pyperl最初是针对非常旧的版本编写的   Python并且不再编译。同时,写C   由于有了Cython,Python的扩展变得更加容易。一世   认为从头开始是有意义的,于是写了PyPerler。一世   值得庆幸的是,利用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    
Earth    6378  5.52   
Jupiter 71030  1.3

如果您安装了Class :: Inspector CPAN软件包,那么PyPerler甚至会为您进行内省,以便在IPython中使用。