【问题标题】:Running Octave tasks from Python从 Python 运行 Octave 任务
【发布时间】:2016-03-10 23:10:08
【问题描述】:

我有一个用 Octave 编写的非常复杂的计算代码和一个接收用户输入的 python 脚本,需要根据用户输入运行 Octave 代码。在我看来,我有以下选择:

  1. 将 Octave 代码移植到 python。
  2. 使用使您能够从 python 运行 Octave/Matlab 引擎的外部库(即 oct2py)。
  3. 在 python 进程和 octave 进程之间进行通信。其中一种可能性是使用 python 代码中的 subprocess 并等待答案。

由于我非常不愿意将我的代码移植到 python,并且我不想依赖 oct2py 等外部库的维护,所以我赞成选项 3。但是,由于系统应该可以很好地扩展,我不想为每个请求生成一个新的 octave 进程,并且任务队列系统似乎更合理。是否有任何(推荐的)任务队列系统可以将 python 中的任务排入队列并在另一端处理它?

【问题讨论】:

    标签: python subprocess octave message-queue oct2py


    【解决方案1】:

    这里描述的方式,选项 3 退化为选项 2,因为 Octave 没有明显的方式(API 或包)让“Octave worker”连接到任务队列。

    only way Octave 由the sockets package 执行“网络”,这意味着从头开始(在 Octave 中)实现与任务队列通信的协议。

    拥有“Octave worker”的最初动机是让 Octave 的主进程启动一次,然后“指导”它执行函数并返回结果,而不是在每次调用函数时启动 Octave 的主进程.

    由于 Octave 无法开箱即用地执行“工作人员”(即launches, listens to a 'channel' and executes code),实现此目的的唯一其他方法是让任务队列框架全部在 Python 中工作,并且仅在您需要其功能时调用 Octave,最有可能通过oct2py(即选项2)。

    有很多不同的方法可以做到这一点,从RedisPyPubSubCeleryRabbitMQ。所有这些都简单明了,并且有据可查。 PyPubSub 不需要任何额外的组件。

    (就像一个注释:拥有an 'executable' octave scriptcalling it via Python and blocking until it returns 的解决方案并不像听起来那么糟糕,for some parallel-processing frameworks 这是让同一 Octave 脚本的多个副本对不同数据进行操作的唯一方法段。)

    【讨论】:

      【解决方案2】:

      这三个选项都是合理的,具体取决于您的具体情况。

      我不想依赖oct2py等外部库的维护,我赞成方案3

      oct2py 是使用选项 3 实现的。您可以重新发明它已有的功能或直接使用它。 oct2py 是纯 Python 并且它具有许可许可证:如果它的开发明天停止;你可以在你的代码旁边包含它的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-19
        • 2021-04-26
        • 2023-02-07
        • 2015-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        相关资源
        最近更新 更多