How can I clear specific Python classes/modules from memory without using "clear classes"
Afficher commentaires plus anciens
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 commentaire
Emil Geiger
le 9 Juil 2018
Réponses (2)
Emil Geiger
le 19 Juil 2018
2 commentaires
Minchae Jeong
le 25 Nov 2021
Modifié(e) : Minchae Jeong
le 25 Nov 2021
Love you my brother this helped me a lot!
Arwel
le 5 Mar 2024
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
le 20 Juin 2022
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 commentaires
Peter Qiang
le 29 Mai 2023
This question has been bothering me for a long time. Many thanks for your solution!
Is a very useful method because in my 2021b with py 3.9, command line like:
clear classes
myModule = py.importlib.import_module('myModule');
py.importlib.reload(myModule);
just not working properly in my environment.
I guess cache still exist in somewhere after run that codes. So overwrite it seems become the only way works for me. To avoid overwrite matlab built-in py module I changed module variable name by remove perfix "py." , like:
myModule = py.importlib.reload(py.importlib.import_module('myModule'));
then call our module function with:
myModule.myFunction(args)
Thus it won't overwrite py. It works for me, at least, for now.
Lucademicus
le 8 Déc 2023
It does not work for me in 2023B. Does anyone have another solution for me?
Arwel
le 5 Mar 2024
Ditto for me - no joy with 2023b....
Catégories
En savoir plus sur Python Package Integration dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!