【问题标题】:Recommendations for perl-to-python interoperation?perl-to-python 互操作的建议?
【发布时间】:2010-12-06 02:43:35
【问题描述】:

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

那么...关于如何实现这一目标的任何建议?我们正在考虑几个选项:

  1. 编写模拟函数调用的可执行文件(在 Perl 中);在 python 中调用那些 Perl 可执行文件作为系统调用。
  2. 在 Python 仪表板中即时编写 Perl 可执行文件,并调用(临时)Perl 可执行文件。
  3. 找到某种 Perl-to-Python 转换器或绑定。

还有其他想法吗?我很想听听其他人是否遇到过这个问题。不幸的是,目前无法将代码库本身转换为 Python。

【问题讨论】:

  • Perl 也有 Tk 和 Wx 绑定。 Python 真的能解决这个问题吗?
  • 是的,这是另一种可能性。我们真的厌倦了在这里编写 Perl,我们真的很喜欢 Python。所以我们认为这可能是一个很好的机会。只是想考虑一下我们的选择:) - mrstevegross
  • 有趣。我能理解你为什么喜欢 Python。我想听听你为什么厌倦了 Perl。
  • 我想每个人都喜欢不时地做出改变,但如果我要切换到 Perl,就不会是 Python。相同的基本内容,但更少。 (Haskell 我很兴奋。用 Perl 的库来换取 Haskell 的类型系统和速度几乎是值得的。几乎。)

标签: python perl


【解决方案1】:

我不想成为合唱团中的另一个人,但是......

  1. 避免使用其他语言
  2. 使用 Wx,使其具有原生外观和感觉,使应用程序在非技术人员看来“真实”。
  3. 下载 Padre 源代码,看看它是如何处理 Wx Perl 代码的,然后大肆窃取它的最佳技巧,或者干脆把它掏空并使用应用程序框架(使用 Perl 双许可证的 Artistic 部分使其合法)。
  4. 构建您自己的 Strawberry Perl 子类,将应用程序打包为 MSI 安装程序,并将其推送到公司 Active Directory 域中。

当然,我之所以这么说只是因为您说“仪表板”,而我将其解读为“公司”,这让我假设了一个 Microsoft AD 网络...

【讨论】:

  • 很高兴你发布了这个。我要提到的是,Padre 已经证明 Wx + Perl 非常“可用于生产”。
【解决方案2】:

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

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

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

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

【讨论】:

  • 太棒了,我想说的其他一切。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    好吧,如果你真的想用另一种语言编写 GUI(说真的,这只是个坏主意,因为它会花费你更多的钱而不是它能给你带来的好处),你应该做的事情如下:

    1. 根据 Perl 应用程序提供的服务记录您的应用程序。您应该使用 XML 模式定义 - XSD - 用于数据类型和 Web 服务描述语言 - WSDL - 用于实际服务。
    2. 在 Perl 中实现服务,可能使用 Catalyst::Controller::SOAP 或仅使用 XML::Compile::SOAP。
    3. 从任何语言的 GUI 界面使用服务。
    4. 利润。

    但老实说,我真的建议你看一下 Perl GTK2 绑定,它很棒,包括完全在 Perl 中实现 Gtk 类并将其用作用 C 编写的函数的参数等功能 - 例如,你可以完全用 Perl 为 gtk 树编写模型类。

    【讨论】:

      【解决方案5】:

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

      Inline::Python

      如果一定要用python,Inline::*系列模块已经普遍好评。这使您可以在 perl 脚本中编写 python。您仍然必须编写 perl,但它可以让您在 perl 脚本中使用 python 库。不过,这会使调试变得更加困难。

      【讨论】:

        【解决方案6】:

        我认为任何合格答案的主要标准将涉及现有代码库的详细信息。这个 Perl 代码是如何调用的,它是如何返回结果的?

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

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

        让我们问一个不同的、更广泛的问题:您打算在仪表板和现有代码库之间使用什么接口?

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2014-07-12
            • 2012-07-05
            • 1970-01-01
            • 2021-07-31
            • 1970-01-01
            • 1970-01-01
            • 2018-03-05
            • 1970-01-01
            • 2019-04-15
            相关资源
            最近更新 更多