如何在Python中调用Perl函数

如何在Python中调用Perl函数,python,perl,Python,Perl,我在Perl模块中编写了一些函数。我必须在Python中调用这些函数并获得输出 我已经看到了链接 . 我找不到他们在Python中导入的Perl模块 当我尝试在Linux中安装pyperl时,它无法找到它 我能够运行简单的Perl脚本并获得输出,但我无法调用用Perl编写的函数并获得输出。使用popen运行Perl解释器并执行所需的代码。运行Perl时,包括-m MODULE开关以加载所需的模块,以及-e表达式以执行所需的函数。例如,此代码在POSIX模块中运行函数并获得其(字符串)结果: 如果

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

我已经看到了链接 . 我找不到他们在Python中导入的Perl模块

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


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

使用
popen
运行Perl解释器并执行所需的代码。运行Perl时,包括
-m MODULE
开关以加载所需的模块,以及
-e表达式以执行所需的函数。例如,此代码在
POSIX
模块中运行函数并获得其(字符串)结果:

如果需要在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'}

我们今天正在做一些类似的事情,使用一个名为
perlfunc.py
at的模块

测试日期:

  • Python 2.7.12
  • perl 5,版本22,subversion 1(v5.22.1),为x86_64-linux-gnu-thread-multi构建
对perlfunc.py进行了微调:

  • 引发运行时错误(a.communicate()[1])
    (第41行)
  • 从第132行中删除“已定义”
非常古老。pl

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

1;
重用非常旧的perl\u 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!')
From():

我花了一些业余时间编写Python->Perl接口。这个 现有的解决方案最初是为非常旧的版本编写的 不再编译。同时,编写C 多亏了Cython,Python的扩展变得容易多了。我 认为从零开始是有意义的,于是写了PyPerler。我 谢天谢地,我们使用了PyPerl的Perl代码来包装Python 对象在Python方面,一切都是新的

PyPerler为您提供了CPAN和(遗留的?)perl的强大功能 包,在Python中。使用Perl工具非常简单:


如果您安装Class::Inspector CPAN包,PyPerler甚至会让您在IPython中使用内省。

在perl中需要访问哪个函数?您是如何尝试安装的?我尝试过从新安装,但在Ubuntu上也失败了。。。如果它只是一个函数,那么在python中找到等效函数不是更容易吗?@alvas我个人并不感到惊讶,我会避免在文档中安装一个提到python1.5的库,并且不再维护它。
Inline::python
非常适合在Perl中嵌入python,但另一种方法目前似乎并不可行。谢谢你,jwodder,对内容进行格式化:现在看起来容易多了。我是这个小片段的作者。最近我对其进行了更新,使其与Python2.7.x和python3兼容。请随时与我联系以进行改进。:)现在在github上:
#!/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!')
>>> 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