运行 来自 Python 的 Octave 任务
Running Octave tasks from Python
我有一个用 Octave 编写的相当复杂的计算代码和一个接收用户输入的 python 脚本,并且需要 运行 基于用户输入的 Octave 代码。如我所见,我有以下选择:
- 将 Octave 代码移植到 python。
- 使用外部库(即 oct2py),使您能够从 python.
运行 Octave/Matlab 引擎
- 在 python 进程和 Octave 进程之间进行通信。一种可能性是使用 python 代码中的子进程并等待答案。
因为我不太愿意将我的代码移植到 python 并且我不想依赖外部库(如 oct2py)的维护,所以我赞成选项 3。但是,由于系统应该很好地扩展,我不想为每个请求生成一个新的八度进程,任务队列系统似乎更合理。是否有任何(推荐的)任务队列系统将任务排入 python 并让另一端的 Octave worker 处理它?
这里描述的方式,选项 3 退化为选项 2,因为 Octave 没有明显的方法(API 或包)让 'Octave worker' 连接到任务队列。
only way Octave does "networking" is by the sockets package,这意味着从头开始(在 Octave 中)实现与任务队列通信的协议。
拥有 'Octave worker' 的最初动机是让 Octave 的主进程启动一次然后 "direct it" 执行函数和 return 结果,而不是启动主进程每次调用函数的 Octave。
由于 Octave 无法开箱即用 'a worker'(即 launches, listens to a 'channel' and executes code),实现此目的的唯一其他方法是让任务队列框架全部在 Python 中工作并且仅在需要 Octave 的功能时调用 Octave,很可能是通过 oct2py
(即选项 2)。
有许多不同的方法可以做到这一点,从 Redis, to PyPubSub, Celery and RabbitMQ 开始。所有这些都很简单,而且有据可查。 PyPubSub 不需要任何额外的组件。
(请注意:an 'executable' octave script, calling it via Python and blocking until it returns is not as bad as it sounds however and for some parallel-processing frameworks 的解决方案是让同一个 Octave 脚本的多个副本在不同数据段上运行的唯一方法。)
根据您的具体情况,所有三个选项都是合理的。
I don't want to rely on maintenance of external libraries such as oct2py, I am in favor of option 3
oct2py
是使用选项 3 实现的。您可以重新发明它已经做的事情或直接使用它。 oct2py
是纯粹的 Python 并且它有许可:如果它的开发明天停止;您可以将它的代码与您的代码放在一起。
我有一个用 Octave 编写的相当复杂的计算代码和一个接收用户输入的 python 脚本,并且需要 运行 基于用户输入的 Octave 代码。如我所见,我有以下选择:
- 将 Octave 代码移植到 python。
- 使用外部库(即 oct2py),使您能够从 python. 运行 Octave/Matlab 引擎
- 在 python 进程和 Octave 进程之间进行通信。一种可能性是使用 python 代码中的子进程并等待答案。
因为我不太愿意将我的代码移植到 python 并且我不想依赖外部库(如 oct2py)的维护,所以我赞成选项 3。但是,由于系统应该很好地扩展,我不想为每个请求生成一个新的八度进程,任务队列系统似乎更合理。是否有任何(推荐的)任务队列系统将任务排入 python 并让另一端的 Octave worker 处理它?
这里描述的方式,选项 3 退化为选项 2,因为 Octave 没有明显的方法(API 或包)让 'Octave worker' 连接到任务队列。
only way Octave does "networking" is by the sockets package,这意味着从头开始(在 Octave 中)实现与任务队列通信的协议。
拥有 'Octave worker' 的最初动机是让 Octave 的主进程启动一次然后 "direct it" 执行函数和 return 结果,而不是启动主进程每次调用函数的 Octave。
由于 Octave 无法开箱即用 'a worker'(即 launches, listens to a 'channel' and executes code),实现此目的的唯一其他方法是让任务队列框架全部在 Python 中工作并且仅在需要 Octave 的功能时调用 Octave,很可能是通过 oct2py
(即选项 2)。
有许多不同的方法可以做到这一点,从 Redis, to PyPubSub, Celery and RabbitMQ 开始。所有这些都很简单,而且有据可查。 PyPubSub 不需要任何额外的组件。
(请注意:an 'executable' octave script, calling it via Python and blocking until it returns is not as bad as it sounds however and for some parallel-processing frameworks 的解决方案是让同一个 Octave 脚本的多个副本在不同数据段上运行的唯一方法。)
根据您的具体情况,所有三个选项都是合理的。
I don't want to rely on maintenance of external libraries such as oct2py, I am in favor of option 3
oct2py
是使用选项 3 实现的。您可以重新发明它已经做的事情或直接使用它。 oct2py
是纯粹的 Python 并且它有许可:如果它的开发明天停止;您可以将它的代码与您的代码放在一起。