使用参数从 Matlab 调用 Python 脚本

Posted

技术标签:

【中文标题】使用参数从 Matlab 调用 Python 脚本【英文标题】:Calling Python script from Matlab with arguments 【发布时间】:2014-01-17 18:41:08 【问题描述】:

我正在从 matlab 调用一个 python 脚本。 python 脚本需要 3 个数组作为输入参数:

import sys
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect('equal')

X = np.array(float(sys.argv[1]), dtype =np. float32)
Y = np.array(float(sys.argv[2]), dtype =np. float32)
Z = np.array(float(sys.argv[3]), dtype =np. float32)

scat = ax.scatter(X, Y, Z)

我像这样从 Matlab 调用 Python 脚本:

!"MYPATH\python.exe" test3.py dX dY dZ

在 Matlab 中,dXdYdZ 都是 1x500 数组类型。 但是,我收到以下错误:

ValueError: could not convert string to float: dX

看起来 python 脚本调用不评估 dX 数组并将参数作为字符串。我该如何纠正?

【问题讨论】:

【参考方案1】:

没有直接的方法可以将数组参数传递给命令行程序。基本上,所有命令行参数将始终被解释为字符串,分解成单词。您可以在命令行中将数组作为单独的条目传递,但命令行的长度是有限制的。我建议您将 Matlab 中的数组save 保存到文本文件中,然后将它们加载到 Python 程序中:

在 Matlab 中

filename = tempname;
data = [dX' dY' dZ'];
save(filename, 'data', '-ascii');
system(['"MYPATH\python.exe" test3.py "' filename '"']);

在 Python 中:

dX, dY, dZ = np.loadtxt(sys.argv[1]).T

【讨论】:

看起来是一个很有前途的解决方案,但是我收到以下错误:???使用 ==> 系统时出错 输入参数过多。 如果我尝试system(['"MYPATH\python.exe"', 'test3.py'], filename);,我会收到以下错误:Error using ==> system Unrecognized option: tempname.txt 我已更改代码以正确构建命令。很抱歉,这只是 Matlab 的另一个不一致之处。 完美运行。由于MYPATH 包含空格,我将system 命令更改为:system(['"MYPATH\python.exe" test3.py "' filename '"']);

以上是关于使用参数从 Matlab 调用 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

[python][matlab]使用python调用matlab程序

从 MATLAB Compiler 应用程序调用 python 时无法调用 python 库

如何在MATLAB中调用(运行)“用Python写成的函数或脚本”

Matlab 调用 Python 脚本

如何:可以从 Unix 命令行获取参数的 MATLAB 脚本

从 Python 运行 Matlab 脚本:TypeError: 'float' object is not iterable