Issues calling python from Matlab compiled executable in a docker container on WSL2

18 vues (au cours des 30 derniers jours)
I am trying to call a python script from Matlab (2022b update 3) function compiled into a docker container on WSL2. I have tried a couple methods, but no luck. For example, I tried using the following build procedure below (where the python3 executable and the python file are in ./AdditionalFiles). Calling the python fails:
Python commands require a supported version of CPython.
Error in testCompPy
MATLAB:Python:PythonUnavailable
I tried including the pyenv("Version","/python3") in the matlab script and that errors as well.
MATLAB:Pyversion:InvalidPath
even though including exist("/python3") in the compiled function shows that is there.
By adding a disp(pwd) to the Matlab code I was able to see that pwd is "/", which is why I copy the additional files there. Futhermore, apt-get commands don't seem to work but I think that might be something to do with running in a docker container inside wsl.
res = compiler.build.standaloneApplication('testCompPy.m','TreatInputsAsNumeric', false);
opts = compiler.package.DockerOptions(res,'ImageName','testcompy-standalone-app','AdditionalInstructions',...
["COPY ./AdditionalFiles/ /"]);
compiler.package.docker(res, 'Options', opts);
The resulting DockerFile looks like
FROM matlabruntime/r2022b/release/update3/300000000000000000
COPY ./applicationFilesForMATLABCompiler /usr/bin/mlrtapp
RUN chmod -R a+rX /usr/bin/mlrtapp/*
# AdditionalInstructions
COPY ./AdditionalFiles/ /
RUN useradd -ms /bin/bash appuser
USER appuser
ENTRYPOINT ["/usr/bin/mlrtapp/testCompPy"]
Any advice or ideas would be appreciated. Also, any insight into what capabilities from Ubuntu are in the matlabruntime docker image would also be helpful.
For reference, the m-file being compiled is
function testCompPy(varargin)
disp(pwd)
disp(pyenv)
disp(exist("/python3"))
% Tried with and without the following:
pyenv("Version",'/python3')
in = {'Jones','Johnson','James'};
N = py.list(in);
names = py.mymod.search(N);
disp(string(names))
  1 commentaire
Steven Bordonaro
Steven Bordonaro le 9 Fév 2023
I was able to get this to work with the following;
res = compiler.build.standaloneApplication('testCompPy.m',...
'TreatInputsAsNumeric', false);
opts = compiler.package.DockerOptions(res,'ImageName','testcompy-standalone-app', ...
'AdditionalInstructions',...
["RUN apt-get update && \" ...
"apt-get install -y python3 python3-dev && \" ...
"apt-get clean", ...
"COPY ./AdditionalFiles/ /"]);
compiler.package.docker(res, 'Options', opts);

Connectez-vous pour commenter.

Réponses (1)

Dinesh
Dinesh le 29 Mar 2023
Hi Steven!
It is great to know that you have solved the issue yourself. Matlab docker images are based on Debian, a Linux distribution.
Docker allocates a read-write filesystem to the container. Suppose your host system is Windows and the container image uses Linux, binaries that work on Windows (.exe files) will not be compatible inside your container and that is most likely the reason for the error.
opts = compiler.package.DockerOptions(res,'ImageName','testcompy-standalone-app', ...
'AdditionalInstructions',...
["RUN apt-get update && \" ...
"apt-get install -y python3 python3-dev && \" ...
"apt-get clean", ...
"COPY ./AdditionalFiles/ /"]);
In the Docker options, you specified installing python3 in the container. This installs python3 and python3-dev for Linux, which is why you can make it work. Installing all dependencies that your container needs directly rather than copying them is always better.

Catégories

En savoir plus sur Call Python from MATLAB dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by