【发布时间】:2016-10-22 03:21:44
【问题描述】:
我有一个 python 代码,它使用 subprocess.Popen 在后台运行 matlab 函数 sussum(a,nx,ny)。我无法让它工作。因为我无法正确地将输入参数传递给 matlab。这是python代码:
#!/usr/bin/env python
import matlab.engine
import scipy.io as sio
import numpy as np
import subprocess as sb
nproc = 5
input = sio.loadmat('sus_py.mat')
totq = input['totq']
nx,ny = input['nx'],input['ny']
nq = totq+1
nx,ny = matlab.int32(nx.tolist()) , matlab.int32(ny.tolist())
iq = range(1,nq)
gp = len(iq)/nproc
list = [iq[j:j+nproc] for j in range(0,len(iq),nproc)]
for g in range(0,len(list)):
i = len(list[g])
p = []
for n in range(0,i):
a = matlab.int32(list[g][n])
fun = '-r "sussum(a,nx,ny); exit" '
lmb = ['/usr/local/bin/matlab','-nodesktop','-nosplash','-nodisplay','-nojvm',fun]
p.append(sb.Popen(lmb))
for q in p:
q.wait()
python 脚本在集群网络的命令终端中执行,直到它吐出错误消息:未定义的函数或变量'a'。
我确信 matlab 函数 sussum(a,nx,ny) 工作正常,因为我已经使用 Python-Matlab API 作为 matlab.engine.start_matlab().sussum(a,nx,ny) 对其进行了测试,它给出了所需的输出。非常感谢使用 subprocess.Popen() 运行 python 代码的任何帮助。
【问题讨论】:
-
您没有将变量的值传递给函数,而是在调用 Popen 时有效地将字符串“sussum(a,nx,ny)”作为参数写入 shell。就像您将 lmb 逐字输入 shell 一样,它不知道这些变量的值。如果要以这种方式调用函数,则需要将它们从 numpy 矩阵转换为 Matlab 语法以传递值,而不是变量的名称
-
@TWReever:你应该把它作为答案
标签: python matlab python-2.7 subprocess popen