How can I clear specific Python classes/modules from memory without using "clear classes"

조회 수: 25 (최근 30일)
I have successfully developed a workflow that will allow me to call custom python code from Matlab, see the following two scripts:
MATLAB:
function out = reloadPy() % A Matlab function
clear classes
mod = py.importlib.import_module('mymod');
py.importlib.reload(mod);
v1 = 1:5;
v2 = 6:10;
out = double(py.mymod.add2Vectors(v1,v2));
Python:
# mymod.py - a python function
import numpy
import array
def add2Vectors(v1, v2):
myarray = numpy.array(v1) + numpy.array(v2)
return array.array('d', myarray)
If I call reloadPy from the command line I get the following output:
>> test = reloadPy
Warning: Objects of 'onCleanup' class exist. Cannot clear this class or any of its superclasses.
> In reloadPy (line 2)
Warning: Objects of 'table' class exist. Cannot clear this class or any of its superclasses.
> In reloadPy (line 2)
Warning: Objects of 'datetime' class exist. Cannot clear this class or any of its superclasses.
> In reloadPy (line 2)
test =
7 9 11 13 15
>>
The warnings are stemming from the "clear classes" command. I am using that sequence of commands (lines 2-4) to reload the python module while debugging. Any changes I make to mymod.py are not captured unless I execute all 3 commands. The documentation for "clear" states:
Calling clear all, clear classes, and clear functions decreases code performance, and is usually unnecessary. ...
To clear a particular class, use clear myClass.
Is there a way to just clear just my python class or module? I can't find the name. I tried
[M, X, C] = inmem
But none of the result seem to be related to python.
  댓글 수: 1
Emil Geiger
Emil Geiger 2018년 7월 9일
Update: I can't use this workflow if I pass a variable into reloadPy because clear classes will delete the variable. I have also submitted a support ticket.

댓글을 달려면 로그인하십시오.

답변 (2개)

Emil Geiger
Emil Geiger 2018년 7월 19일
I received an answer from Support. Clearing just the python module is not possible at this time. But wrapping the reload statements in a function is a valid work around because any user variables are out of scope. For example:
function reloadPy()
warning('off','MATLAB:ClassInstanceExists')
clear classes
mod = py.importlib.import_module('mat');
py.importlib.reload(mod);
  댓글 수: 2
Minchae Jeong
Minchae Jeong 2021년 11월 25일
편집: Minchae Jeong 2021년 11월 25일
Love you my brother this helped me a lot!
Arwel
Arwel 2024년 3월 5일
Thanks Emil! This also worked for me, and this makes it general for my use-case (via a file)....
function reloadPy(name)
% Save the module name (so we can reload it after clear..)
save('tempSave','name');
warning('off','MATLAB:ClassInstanceExists')
clear classes
% Reload the name....
name = load('tempSave');
name = name.name;
% Now reload the module....
mod = py.importlib.import_module(name);
py.importlib.reload(mod);
% Get rid of our temporary file...
delete('tempSave.mat');

댓글을 달려면 로그인하십시오.


Fan Yang
Fan Yang 2022년 6월 20일
Say, if we want to reload 'util.py':
py.util = py.importlib.reload(py.importlib.import_module('util'));
This line would work for me. It actually redefined a struct with name 'py', so it may overwrite other module you imported, but if all of your python module is explicitly imported in this way, there seems to be no problem. Anyway this should be regarded as a workaround as well.
  댓글 수: 3
Lucademicus
Lucademicus 2023년 12월 8일
It does not work for me in 2023B. Does anyone have another solution for me?

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Python Package Integration에 대해 자세히 알아보기

제품


릴리스

R2017a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by