Ich habe einen Python-Code, der eine Matlab-Funktion sussum (a, nx, ny) im Hintergrund mit subprocess.Popen ausführt. Ich kann es nicht funktionieren. Weil ich die Eingabeargumente nicht korrekt an Matlab übergeben kann. Hier ist der Python-Code:Aufrufen einer Matlab-Funktion mit Python Subprozess.Popen
#!/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()
das Python-Skript ausführt, in dem Befehlsanschluss eines Cluster-Netzwerk, bis er die Fehlermeldung ausspuckt: Undefiniert Funktion oder Variable ‚a‘.
Ich bin sicher, dass die Matlab-Funktion Sussum (a, nx, ny) funktioniert gut, weil ich getestet habe es Python-API Matlab als matlab.engine.start_matlab() verwenden. Sussum (a, nx, ny) und gab die gewünschten Ergebnisse. Jede Hilfe beim Ausführen des Python-Codes mit subprocess.Popen() wird sehr geschätzt.
Sie übergeben die Werte Ihrer Variablen nicht an die Funktion, Sie schreiben effektiv die Zeichenfolge "sussum (a, nx, ny)" als Parameter für die Shell, wenn Sie Popen aufrufen. Das gleiche, als ob Sie Ihr lmb-Wort in die Shell eingegeben hätten, es hat keine Ahnung von dem Wert dieser Variablen. Sie müssen sie aus den numpy-Matrizen in die Matlab-Syntax übersetzen, um die Werte anstelle der Namen der Variablen zu übergeben, wenn Sie die Funktion auf diese Weise aufrufen möchten. – TWReever
@TWReaver: Sie sollten das als Antwort verwenden – TheBlackCat