我需要在Python中运行Matlab脚本.为了实现这一点,首先我安装了Matlab的调试器(MCR),使用了this个文档.然后,我使用this文档创建并安装了matlab脚本的python模块.特别是,我使用了Matlab的SDK应用程序来创建模块,然后使用python setup.py install安装创建的目录,setup.py在生成的目录中,我可以使用以下代码在Python内部本地执行脚本:

import test_function

mypkg = test_function.initialize()
arg1 = 1
arg2 = 2
out1, out2 = mypkg.test_function(arg1, arg2, nargout=2)
print(out1, out2)
mypkg.terminate()

现在我想从Docker容器内部执行模块.因此,我安装了MCR安装zip文件(Linux 64从here),解压缩并保存到目录matlab_runtime.在Dockerfile中,我用Matlab SDK模块复制了目录(test_function),用MCR安装目录(matlab_runtime)复制了目录,并try 安装Matlab.以下是对Dockerfile的更改:

FROM mathworks/matlab-runtime-deps:R2023b

# other not-related commands
# ...
# other not-related commands

RUN apt-get install -y python3.9 python3-pip
COPY test_function /app/test_function
COPY matlab_runtime /app/matlab_runtime
RUN ls /app/matlab_runtime
RUN pip install setuptools
WORKDIR /app
USER root
RUN chmod +x ./matlab_runtime/install
RUN python3 test_function/setup.py install
RUN sudo -H ./matlab_runtime/install

但是我得到了这个错误:failed to solve: rpc error: code = Unknown desc = process "/bin/sh -c sudo -H ./matlab_runtime/install" did not complete successfully: exit code: 42.

我try 在Dockerfile中使用make:

RUN apt update && apt install -y make
RUN make ./matlab_runtime/install

Docker不会返回任何错误,但是当我在Docker容器中运行上面的Python脚本时,我得到了错误:AttributeError: module 'LC_filter_for_AI' has no attribute 'initialize',当我使用dir(test_function)判断模块的方法时,我得到了:

['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

而对于模块的本地安装,

['_PathInitializer', '__builtins__', '__cached__', '__doc__', '__exit_packages', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_pir', 'atexit', 'glob', 'importlib', 'initialize', 'initialize_runtime', 'os', 'pdb', 'platform', 're', 'sys', 'terminate_runtime', 'weakref']

推荐答案

我可以如下解决这个问题.我把我的Dockerfile变成了这个:

FROM containers.mathworks.com/matlab-runtime:r2023a

# other not-related commands
# ...
# other not-related commands

RUN apt-get install -y python3.9 python3-pip
COPY test_function /app/test_function
RUN pip install setuptools
WORKDIR /app/test_function
USER root
RUN python3 setup.py install
ENV LD_LIBRARY_PATH=/opt/matlabruntime/R2023a/runtime/glnxa64:/opt/matlabruntime/R2023a/bin/glnxa64:/opt/matlabruntime/R2023a/sys/os/glnxa64:/opt/matlabruntime/R2023a/sys/opengl/lib/glnxa64:$LD_LIBRARY_PATH
ENV AGREE_TO_MATLAB_RUNTIME_LICENSE=yes

因此,我使用了一个预构建的官方MATLAB容器镜像(containers.mathworks.com/matlab—runtime:r2023a).修改:之后的标记以使用不同版本的MCR.有关更多信息,请查看documentation个Matlab容器.在我的例子中,matlab runtime安装到/opt/matlabruntime/R2023a/.所以我相应地把LD_LIBRARY_PATH和所有执行所需的路径,并且我必须同意matlab运行时许可证才能执行.

再次运行docker容器后,我没有上述问题.

Python相关问答推荐

如何根据条件在多指标框架上进行groupby

scikit-learn导入无法导入名称METRIC_MAPPING64'

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

启用/禁用shiny 的自动重新加载

通过ManyToMany字段与Through在Django Admin中过滤

基于行条件计算(pandas)

在极中解析带有数字和SI前缀的字符串

python sklearn ValueError:使用序列设置数组元素

巨 Python :逆向猜谜游戏

使用嵌套对象字段的Qdrant过滤

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

如何获得满足掩码条件的第一行的索引?

在pandas中,如何在由两列加上一个值列组成的枢轴期间或之后可靠地设置多级列的索引顺序,

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

从列表中分离数据的最佳方式

Django更新视图未更新

Stats.ttest_ind:提取df值

对于数组中的所有元素,Pandas SELECT行都具有值