2016-10-22 4 views
0

나는 subprocess.Popen으로 백그라운드에서 matlab 함수 sussum (a, nx, ny)을 실행하는 파이썬 코드를 가지고있다. 나는 그것을 작동시킬 수 없다. 왜냐하면 나는 matlab에 입력 인수를 올바르게 전달할 수 없기 때문이다. 여기 파이썬 코드 :는 오류 메시지 뱉어까지파이썬 서브 프로세스로 matlab 함수 호출하기 .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() 

Python 스크립트는 클러스터 네트워크의 명령 단자에서 실행 : 정의되지 않은 함수 또는 'A'변수.

나는 matlab.engine.start_matlab(). sussum (a, nx, ny)와 같이 Python-Matlab API를 사용하여 matlab 함수 sussum (a, nx, ny)이 제대로 작동한다고 확신한다. 원하는 출력을 주었다. subprocess.Popen()을 사용하여 파이썬 코드를 실행하는 데 도움이 될 것입니다.

+1

변수 값을 함수로 전달하지 않고 Popen을 호출 할 때 "sussum (a, nx, ny)"문자열을 쉘 매개 변수로 효과적으로 작성합니다. 쉘에 lmb 동사를 입력 한 것과 같지만 변수의 값에 대한 개념이 없습니다. 이런 식으로 함수를 호출하고자한다면 변수의 이름보다는 숫자를 전달하기 위해 numpy 행렬에서 Matlab 문법으로 변환해야합니다. – TWReever

+0

@TWReever : 이것을 답으로 사용해야합니다 – TheBlackCat

답변

1

subprocess.Popen(args)을 사용하여 Popen 개체를 만드는 경우 실제로는 lmb 목록 목록 (공백으로 결합)의 내용을 실행할 셸로 전달하는 것이 좋습니다. 이 경우, 명령에 해당 될 것입니다 : 분명히

/usr/local/bin/matlab -nodesktop -nosplah -nodisplay -nojvm -r "sussum(a,nx,ny); exit" 

, 이것은 오류가 발생할 것입니다 당신이 쉘에서 직접 실행 한 경우,이 명령에 의해 생성 된 MATLAB 인스턴스가 a 것을 알고하지 않기 때문에, nxny은 변수이며, 쉘은이 경우 모든 매개 변수를 -r 매개 변수에 인수로 전달하는 문자열을 처리합니다. 커맨드 라인에서 이것을 실행했다면, MATLAB으로 전달 될 때 어떤 것을 의미하는 값으로 심볼을 대체해야합니다. 명령 자체에 변수를 수동으로 작성하거나 사용중인 쉘에 적합한 변수 확장 방법을 사용하여이 작업을 수행 할 수 있습니다.

파이썬 Popen 개체를 통해 실행하려는 경우 변수를 실제 fun 문자열로 대체해야합니다. 파이썬에서이 엄격을 수행한다면 당신이있어 scipy.io.loadmat에 의해 당신에게 주어진 numpy.ndarray에서 a, nxny 값을 끌어 야하기 때문에, 당신은 불행하게도

# define variables 
a = 10 
nx = [1, 2, 3, 4] 
ny = [10, 20, 30, 40] 

# build fun string from above variables 
# -r "sussum(10, [1,2,3,4], [10,20,30,40]); exit; 
fun = '-r "sussum({}, [{}], [{}]); exit";'.format(a, ','.join(nx), ','.join(ny)) 

처럼 뭔가를 할 수 당신 앞에있는 값을 추출하여 sussum 함수에서 받아 들일 수있는 형식으로 포맷하는 것보다 더 많은 작업이 필요합니다.

관련 문제