我有一个 Delphi Win32程序,需要运行一些脚本Octave。我已经采取了通过Python 4Delphi进入Python“环境”的方法,在那里我可以编写和运行通过Oct 2 Py访问Octave的脚本。为了安装Oct 2 Py,我放弃了Windows Python安装,转而使用Anaconda,其中包括Numpy和Oct 2 Py/Octave设置所需/有用的其他东西。经过一些死胡同沿着道路上,我实际上得到了它的所有工作-相当整洁的东西!但是,我这里有一个性能问题。考虑一下我通过Python 4Delphi调用的Python脚本,我初始化Oct 2 Py/Octave,然后调用一个名为myScript.m
的本地Octave脚本:
from oct2py import Oct2Py
oc = Oct2Py()
oc.myScript(7)
当我从shell运行这个脚本时,第1行大约需要3秒,第2行需要另一秒;有趣是,当从 Delphi /Python 4Delphi运行时,第1行似乎几乎是0,而第2行大约是1。在所有场景中,第3行花费大约200 ms。现在,我真正需要做的是在执行过程中多次调用oc.myScript()
,虽然200 ms是合理的,但1.在前两行的基础上增加3到4秒是不可接受的。“显而易见”的解决方案是以某种方式缓存前两行实现的Octave连接的导入/初始化,然后将oc
传递给后面重复的oc.myScript()
调用--但该怎么做呢?
这里似乎有三种可能性:
1.将oc
返回到 Delphi 并让它“保持”其生命周期;
1.以某种方式保持TPythonEngine“示例”(不确定,但它可能不是一个实际的对象,但概念是相同的)活着;
1.来自Python 4Delphi的Demo 09包含了一个DLL,它似乎将idea 2作为一个DLL来执行。
这里的一个相关问题是,我想调用Python和Octave脚本,同时在调用之间维护某种历史/状态;换句话说,我真正想要的是以某种方式初始化Python和Octave环境一次,然后使用“预初始化”环境多次调用它们,而不是每次调用之间都将它们拆除并重建它们。这是可行的/合理的/可理解的吗?
另一个想法:是否可以跳过Python 4Delphi/Python/Oct 2 Py,直接从Delphi调用Octave?FWIW -我正在使用Python 4Delphi方法处理其他不相关的任务,所以这就是为什么我从它开始。
任何意见或建议将不胜感激!
更新:我想知道TPythonDelphiVar
组件是否可以帮助,但在尝试之前,我只是决定天真(或聪明?).我想/希望TPythonEngine的魔力意味着我的会话将作为我的应用程序进程的一部分进行维护,我按原样运行了我的脚本,然后删除了前两行,然后再次运行oc.MyScript (N)
,果然,它工作了。我的理解是Python环境是在TPythonEngine加载python39时建立的。dll DLL,它将保持活动状态,直到引擎关闭。因此,每次脚本运行时,它都在与所有早期环境相同的环境中运行。这对我的应用程序来说是个好消息,因为我可以运行一个初始脚本来建立Oct 2 Py/Octave连接(i.即初始化oc
);所有后续脚本将看到变量oc
都设置好并准备就绪。
1条答案
按热度按时间c0vxltue1#
事实证明,一旦通过TPythonEngine加载Python DLL,程序的进程将维护Python会话,这样,一旦创建了Oct 2 Py对象,它就会继续存在,并且可以在同一会话期间被其他脚本重用。虽然我在技术上可能不是100%正确,但对我来说,将其视为从shell运行python是有帮助的;一旦您启动了它的CLI,您在全局上执行的所有操作都在那里,直到您退出shell。..