用python调用matlab函数子流程.Popen

2024-05-14 08:48:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python代码,它在后台运行一个matlab函数sussum(a,nx,ny)子流程.Popen. 我不能让它工作。因为我无法将输入参数正确地传递给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脚本在集群网络的命令终端中执行,直到它发出错误消息:Undefined function or variable'a'。在

我确信matlab函数sussum(a,nx,ny)工作得很好,因为我已经用Python matlabapi as进行了测试matlab.engine.start_matlab().sussum(a,nx,ny)并给出所需的输出。在运行python代码时有什么帮助吗子流程.Popen()将不胜感激。在


Tags: 代码inimportforinputlenasrange
1条回答
网友
1楼 · 发布于 2024-05-14 08:48:06

当您使用subprocess.Popen(args)创建一个Popen对象时,您实际上是在使用它将lmb列表的内容(用空格连接)传递给要执行的shell。在这种情况下,相当于您的命令是:

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

显然,如果您直接从shell运行它,这将导致一个错误,因为这个命令创建的MATLAB实例不知道anx和{}是变量,在本例中,shell只将它传递的整个字符串作为-r参数的参数。如果您是从命令行运行它,那么您需要将这些符号替换为值,这些值在传递到MATLAB时意味着什么。您可以通过在命令本身中手动写入变量来实现这一点,也可以对所使用的shell使用适当的变量扩展方法。在

在您尝试通过Python Popen对象运行它的情况下,您需要将变量替换为实际的fun字符串。如果您在Python中严格地使用来执行此操作,则可以执行以下操作

^{pr2}$

不幸的是,由于您要从scipy.io.loadmat给您的anx和{}值从scipy.io.loadmat提供给您的nx和{}值,因此您还有更多的工作要做,以便从中提取值并将它们格式化为sussum函数可以接受的格式。在

相关问题 更多 >

    热门问题