perl-to-python互操作的建议?

时间:2009-10-12 20:22:08

标签: python perl

我们在Perl中有一个相当大的代码库。对于可预见的未来,我们的代码库将保留在Perl中。但是,我们正在考虑添加基于GUI的仪表板实用程序。我们正在考虑用Python编写仪表板(使用tkinter或wx)。但问题是,我们希望利用Python GUI中现有的Perl代码库。

那么......关于如何实现这一点的任何建议?我们正在考虑一些选择:

  1. 编写模仿函数调用的可执行文件(在Perl中);在python中调用那些Perl可执行文件作为系统调用。
  2. 在Python仪表板内即时编写Perl可执行文件,并调用(临时)Perl可执行文件。
  3. 找到某种Perl-to-Python转换器或绑定。
  4. 还有其他想法吗?我很想知道其他人是否遇到过这个问题。不幸的是,此时不能将代码库本身转换为Python。

7 个答案:

答案 0 :(得分:7)

我讨厌合唱中的另一个,但是......

  1. 避免使用替代语言
  2. 使用Wx,因此它的原生外观使应用程序对非技术受众看起来“真实”。
  3. 下载Padre源代码,看看它是如何处理Wx Perl代码的,然后从它的最佳技巧中匆匆窃取,或者只是直接窃取它并使用应用程序框架(使用Perl双重许可证的Artistic一半使其合法化)。
  4. 构建您自己的Strawberry Perl子类,将应用程序打包为MSI安装程序,并将其推送到公司的Active Directory域。
  5. 当然,我只是说这一切,因为你说“Dashboard”,我读作“Corporate”,然后让我假设一个Microsoft AD网络......

答案 1 :(得分:6)

您可以生成子进程并使用套接字或STDIO等IPC机制,甚至可以嵌入one interpreter in the other

但是,当Perl提供多个Tk(TkTkxTcl::Tk)绑定以及功能强大的Wx binding时,为什么要切换语言?

我已经使用Perl的Tk和Wx库编写和分发了GUI项目。

如果您需要能够创建独立的可执行文件,请查看PAR::PackerActiveState's PerlAppCava Pacakger

答案 2 :(得分:5)

尝试使用CPAN分发Python (pyperl)与python代码进行交互。

答案 3 :(得分:2)

好吧,如果你真的想用另一种语言编写GUI(严肃地说,这只是一个坏主意,因为它会花费你的成本而不是让你受益),你应该做的事情如下:

  1. 根据其提供的服务记录您的Perl应用。您应该使用XML Schema Definition - XSD - 为数据类型和Web服务描述语言 - WSDL - 为实际服务。
  2. 在Perl中实现服务,可能使用Catalyst :: Controller :: SOAP,或者只使用XML :: Compile :: SOAP。
  3. 使用无论语言的GUI界面消费服务。
  4. 利润。
  5. 但老实说,我真的建议你看看Perl GTK2绑定,它很棒,包括完全在Perl中实现Gtk类并将其用作C语言编写的函数的参数等功能 - 例如,你可以完全用Perl为gtk树编写模型类。

答案 4 :(得分:1)

如果可能,我会避免语言间的通话;脆弱性和依赖性的大量增加等待着你走这条路。但是,有......

Inline::Python

如果必须使用python,Inline::*系列模块一般都很受欢迎。这允许你在perl脚本中编写python。你仍然需要写perl但它会让你在perl脚本中使用python库。但是,它会使调试变得更加困难。

答案 5 :(得分:1)

我认为任何合格答案的主要标准都涉及现有代码库的细节。如何调用这个Perl代码以及它如何返回它的结果?

一组命令行实用程序通过相当好的文本输出返回结果(“好”,如“适用于进一步的机器解析”或“管道友好”)...应该可以很容易地从任何编程语言调用(和Python特别优秀的subprocessmultiprocessing模块。仍然可以使用urlopen2mechanize之类的东西访问在Apache和某些DBMS系统之间分层的Web CGI或其他模块的集合 - 但是绕过Perl代码并编写Python来查询可能更好潜在的(可能是规范的)模型(数据存储)。

如果大部分代码库是一组库或模块......并且您提出的仪表板所需的功能尚未通过某种更高级别的机制(某些命令行界面,网络协议等)公开。那么考虑通过除Perl以外的任何语言与它进行交互,基本上是疯了。 (除非通过一些奇怪且极不可能的命运扭曲,您现有的代码库和预期的实现目标在Parrot下都已稳定。)

让我们问一个不同的,更广泛的问题:您希望在信息中心与现有代码库之间使用哪个界面?

无论您选择何种实施语言,这个问题都至关重要。如果您在Perl中编写仪表板,它仍然需要以某种方式调用您现有的代码库。您可能需要修复代码库,以实现对仪表板的使用支持。在您的代码库支持必要的API(具有命令行或IPC协议调用所需功能,通过任何合理的IPC机制返回结果)的时候......那么您选择的仪表板实现语言将基本上是任意的。

答案 6 :(得分:1)

有趣的项目:我会选择松散耦合并考虑基于XML-RPC或JSON的方法。