已解决:Windows 上的 Delphi、Python4Delphi、Anaconda、Oct2Py 和 Octave

问题描述 投票:0回答:1

我有一个 Delphi Win32 程序需要在 Octave 上运行一些脚本。我采用了通过 Python4Delphi 进入 Python“环境”的方法,我可以在其中编写和运行通过 Oct2Py 访问 Octave 的脚本。为了安装 Oct2Py,我放弃了安装 Windows Python,转而使用 Anaconda,它包括 Numpy 和 Oct2Py/Octave 设置所需/有用的其他东西。在沿途遇到一些死胡同之后,我实际上让一切正常工作 - 非常整洁的东西!但是,我在这里遇到了一些性能问题。考虑我通过 Python4Delphi 调用的 Python 脚本,我在其中初始化 Oct2Py/Octave,然后调用名为

myScript.m
:

的本地 Octave 脚本
(1) from oct2py import Oct2Py
(2) oc = Oct2Py()
(3) oc.myScript(7)

当我从 shell 运行此脚本时,第 1 行大约需要 3 秒,第 2 行需要另一个;有趣的是,当从 Delphi/Python4Delphi 运行时,第 1 行似乎接近 0,而第 2 行大约为 1.3 秒。在所有情况下,第 3 行大约需要 200 毫秒。现在,我真正需要做的是在执行过程中对

oc.myScript()
进行多次调用,虽然 200 毫秒是合理的,但前两行的 1.3 到 4 秒是不可接受的。 “明显”的解决方案是以某种方式缓存前两行实现的与 Octave 连接的导入/初始化,然后将
oc
传递给后面重复的
oc.myScript()
调用——但是怎么做呢?

这里好像有三种可能:

  1. 返回
    oc
    到Delphi并让它“维持”它的生命周期;
  2. 以某种方式保持 TPythonEngine“实例”(不确定,但它可能不是实际对象,但概念是相同的);
  3. Python4Delphi 的 Demo09 包含一个似乎将想法 2 作为 DLL 执行的 DLL。

这里的一个相关问题是我想调用 Python 和 Octave 脚本,同时在调用之间保持某种历史/状态;换句话说,我真正想要的是以某种方式初始化 Python 和 Octave 环境一次,然后多次调用它们,使用“预初始化”环境,而不是每次调用之间将它们拆除并重建它们。这可行/合理/可以理解吗?

另一个想法:是否可以跳过 Python4Delphi/Python/Oct2Py 并直接从 Delphi 调用 Octave? FWIW - 我正在使用 Python4Delphi 方法来处理其他不相关的任务,所以这就是我开始的原因。

任何意见或建议将不胜感激!

更新:我想知道

TPythonDelphiVar
组件是否有帮助,但在尝试之前,我只是决定天真(或聪明?)。认为/希望 TPythonEngine 的魔力意味着我的会话作为我应用程序进程的一部分进行维护,我按原样运行我的脚本,然后我删除了前两行,然后再次运行
oc.MyScript (N)
,果然,它刚刚工作。我的理解是,当 TPythonEngine 加载 python39.dll DLL 时设置的 Python 环境,它一直保持活动状态,直到引擎关闭。因此,每次脚本运行时,它都在与所有早期环境相同的环境中运行。这对我的应用程序来说是个好消息,因为我可以运行初始脚本来建立 Oct2Py/Octave 连接(即在此处初始化
oc
);所有后续脚本都将看到变量
oc
全部设置并准备就绪。

python delphi octave oct2py python4delphi
1个回答
0
投票

事实证明,一旦通过 TPythonEngine 加载了 Python DLL,程序的进程就会维护 Python 会话,这样一旦创建了 Oct2Py 对象,它就会存在并可以在同一会话期间被其他脚本重用。虽然我在这里在技术上可能不是 100% 正确,但对我来说,将其视为从 shell 运行 python 是有帮助的;一旦你启动了它的 CLI,你在全球范围内所做的一切都在那里,直到你退出 shell ...

© www.soinside.com 2019 - 2024. All rights reserved.