Python Matlab中的上下文管理器:在Matlab中调用

Python Matlab中的上下文管理器:在Matlab中调用,python,matlab,exit,enter,contextmanager,Python,Matlab,Exit,Enter,Contextmanager,我有一个python包,我想在Matlab中使用它的类和方法。我知道这可以从Matlab2014b直接完成。我的意思是,你所要做的就是在你的陈述开头加上py.。然而,到目前为止还不错,我还不知道如何通过MATLAB处理上下文管理器,它们是使用with语句调用的。例如,假设我们在一个名为app.py的模块中有以下类 class App(object): def __init__(self, input): self._input = input self.

我有一个python包,我想在Matlab中使用它的类和方法。我知道这可以从Matlab2014b直接完成。我的意思是,你所要做的就是在你的陈述开头加上
py.
。然而,到目前为止还不错,我还不知道如何通过MATLAB处理上下文管理器,它们是使用
with
语句调用的。例如,假设我们在一个名为app.py的模块中有以下类

class App(object):

    def __init__(self, input):
        self._input = input
        self._is_open = False

    def __enter__(self):
        self._is_open = True
        # many other stuff going after this but not relevant to this problem
在Matlab中,我可以将其称为

app = py.app.App(input);
py.getattr(app, '_is_open')

ans =

logical

0
我在我的工作区中看到一个应用程序实例。但是,正如预期的那样,只有
\uuuuu init\uuuu
以这种方式被调用,而不是
\uuuu enter\uuuu

那么,有没有一种方法可以从Matlab调用
\uuuu enter\uuuu
,就好像我们在Python中用App(input)as App:调用它一样


注意:我使用的是Python 3.5.1和Matlab 2017b,我不认为有任何方法可以从Matlab调用Python类的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

重要的是,首先要考虑(通过<代码> SytEngulix和 > XEXEXTY 方法)的目的,这是为了提供一种以范围有限的方式分配和释放资源的方法,无论该范围是正常退出还是通过错误。MATLAB有一种更有限的“作用域”方法:每个函数都有自己的控制结构,如循环、条件语句等。该函数中的所有控制结构都共享该工作空间(与许多语言不同,在这些语言中,这些控制结构都有自己的子作用域)

当在MATLAB中退出工作空间时,它包含的变量将被清除,但分配的任何资源可能仍需要释放。这可以通过对象来实现。当从内存中清除它们时,它们会调用一个给定的函数来管理现有资源。可能正在打开并读取文件:

函数openFileSafely(文件名)
fid=fopen(文件名为“r”);
c=一次清理(@()fclose(fid));
s=fread(fid);
...
结束
在这里,打开一个文件,然后从中读取。创建一个
onCleanup
对象
c
,当退出函数时从内存中清除
c
时,该对象将关闭文件。如果在函数结束时仅使用
fclose(fid)
关闭文件,则从函数退出的错误(例如在读取数据的过程中)将导致文件仍保持打开状态。使用
onCleanup
对象可确保无论函数如何退出,文件都将关闭。下面是一个如何在Python中处理此问题的示例:

打开('some_file','w')作为打开的_文件:
已打开文件。写入('Hola!')
由于MATLAB的“上下文管理”方法与Python不同,因此这可以解释为什么无法访问
\uuuuu enter\uuuu
方法。我尝试了一门我知道有一门课的课:那门课。我首先寻求帮助:

>py.help('io.FileIO.\uuuu输入\uuuuuu')
关于io.FileIO中方法\描述符的帮助:
io.FileIO.\uuuuu输入\uuuuu=\uuuuuu输入\uuuuuuuu(…)
它会找到一些帮助文本。这不是特别有用,但它确实存在。但是,当我创建一个对象并查看它时,无论是
\uuuuu进入\uuuuuuu
还是
\uuuuuu退出\uuuuuuuuuu
(或明确的等效项)都不存在:

>fio=py.io.FileIO('test.txt');
>>方法(fio)
类py.\u io.FileIO的方法:
FileIO eq ge le读取到查找截断写入线
char fileno gt lt可读可读行可查找可写
关闭刷新isatty ne readall readlines tell write
从句柄继承的py.\u io.FileIO的方法。
类句柄的方法:
addlistener eq findprop gt le ne
删除findobj ge是有效的lt notify
不过,当我清除
fio
对象时,我确实注意到了一些有趣的事情。当
fio
对象仍然存在(文件打开时),我无法按预期删除或移动文件。但是,在发出命令
clearfio
后,我没有先关闭文件,就能够正常地与文件交互。这意味着该文件已自动关闭。这让我想知道
\uuuuu exit\uuuu
方法是否会被隐式调用,但我还没有确定它