我想运行一个程序,比如MATLAB或其他来自Python的FEA软件,等待它运行并存储结果,然后再用Python进行处理。 我无法找到一个关于如何这样做的真正基本的例子。 一个简单的代码或任何有用的链接将受到高度赞赏。 Subprocess模块​​的帮助看起来有点复杂。

===============>>#1 票数:0

我只是花了一些时间试图从令人沮丧的模糊文档和示例中解决这个问题,最后弄明白了。 这是一个非常简单的演示示例:

如何从Python运行MATLAB脚本 (使用subprocess.Popen,无需安装matlab引擎)

第1步:创建要运行的MATLAB脚本。 在这个演示中,我有两个脚本,保存在文件夹C:/ Users / User / Documents / MATLABsubprocess中:

triangle_area.m

b = 5;
h = 3;
a = 0.5*(b.* h);  
save('a.txt','a', '-ASCII')

triangle_area_fun.m

function [a] = triangle_area(b,h)
a = 0.5*(b.* h);   %area
save('a.txt','a', '-ASCII')
end

步骤2:创建这两个.m文件后,以下Python脚本使用subprocess.Popen()运行它们:

#Imports:
import subprocess as sp
import pandas as pd

#Set paths and options:
#note: paths need to have forward slashes not backslashes (why?!)
program  = 'C:/Program Files/MATLAB/R2017b/bin/matlab.exe'  #path to MATLAB exe
folder   = 'C:/Users/User/Documents/MATLABsubprocess'       #path to MATLAB folder with scripts to run
script   = 'triangle_area'                                  #name of script to run
options  = '-nosplash -nodesktop -wait'                     #optional: set run options  (nosplash? nodesktop means MATLAB won't open a new desktop window, wait means Python will wait until MATLAB is done beore continuing (needs to be paired with p.wait() after sp.Popen))
has_args = True                                             #set whether the MATLAB script needs arguments (i.e. is it a function?)

#Optional: define arguments to feed to function
if has_args ==True:
    script   = 'triangle_area_fun'                          #select script version with arguments
    b = 5 
    h = 3
    args = '({},{})'.format(b,h)                            #put all args into one string

#Set function string:
#Structure:  """path_to_exe optional_arguments -r "cd(fullfile('path_to_folder')), script_name, exit" """
#Example:    """C:/Program Files/MATLAB/R2017b/bin/matlab.exe -r "cd(fullfile('C:/Users/User/Documents/MATLABsubprocess')), triangle_area, exit" """
#basically, needs to know where the program to use lives, then takes some optional settings, -r runs the program, cd changes to the directory with the script, then needs the name of the script (possibly with arguments), then exits
fun =  """{} {} -r "cd(fullfile('{}')), {}, exit" """.format(program, options, folder, script)  #create function string that tells subprocess what to do
if has_args==True:
    fun = """{} {} -r "cd(fullfile('{}')), {}{}, exit" """.format(program, options, folder, script, args)
print('command:', fun)

#Run MATLAB:
print('running MATLAB script...')
p = sp.Popen(fun)                     #open the subprocess & run the MATLAB script 
p.wait()                              #wait until MATLAB is done before proceeding (this needs to be paired with -wait in options)
print('done')                         #if the run is successful, an output file named a.txt should appear in the folder with the MATLAB scripts

#Import MATLAB output files back into Python:
a = pd.read_csv('a.txt', header=None)             #read text file using pandas
print(a)

  ask by Nischal translate from so

未解决问题?本站智能推荐:

1回复

使用python subprocess.Popen调用Matlab函数

我有一个python代码,它使用subprocess.Popen在后台运行matlab函数sussum(a,nx,ny)。 我无法使其正常工作。 因为我无法将输入参数正确传递给matlab。 这是python代码: python脚本在群集网络的命令终端中执行,直到其吐出错误消息:未
3回复

Popen子进程Python

我正在使用Popen进行远程调用脚本 stdout = s.communicate() 打印标准输出 该脚本不会以shell脚本中提到的状态退出,而是仅显示成功或失败状态。 我想根据外壳脚本退出状态代码。 这是shell脚本 如何获得状态码返回?
1回复

Python,并在Python外部使用参数调用Matlab脚本

我觉得我快到了,但需要额外的推动力! 我正在尝试从Python调用MATLAB脚本(我不担心MATLAB脚本的输出-它独立运行)。 但是,我必须能够从python向MATLAB脚本发送输入。 现在我有(在python中): 我不确定如何将“ myvartoinput”添加到“
1回复

Python中的子进程Popen和PIPE

以下代码将空行打印为输出,为false。 问题不在于权限,因为我使用777权限测试了pdf -file的命令。 如何修复命令以提供正确的输出?
3回复

Python子进程Popen管道

我试图在python中发出命令并读取输入并将其解析回去。 这是我要发出的命令(例如在命令行上运行时的示例) 我正在尝试使用python子进程 ` 是一个| 子进程无法使用命令? 如果是这样,还有另一种方法可以运行此shell命令并获取输入吗? 更新:(使用单个
8回复

具有修改后环境的Python子进程/ Popen

我相信在环境稍有修改的情况下运行外部命令是很常见的情况。 这就是我倾向于这样做的方式: 我感觉到有更好的办法了。 看起来还好吗?
2回复

Python子进程.Popen不起作用

我一直在阅读许多文档,但仍不确定我在做什么错。 因此,我有一个单独的Shell脚本,它会启动一个单独的服务器,然后启动我正在处理的服务器。 连接服务器后,我要运行ls就是这样。 但是,由于某种原因,stdin = subprocess.PIPE阻止了Popen命令的终止,以便可以执行下
2回复

在Python中终止启动的Popen子进程

我在Windows上,正在使用subprocess.Popen启动一个新进程,该进程要在某个点终止。 但是,我启动的gui仍然可见。 一个最小的示例是启动PNG查看器: 在执行kill()命令后,gui仍在运行,我必须手动将其关闭。 作为FAS,我理解这一点可以在Linux上通
1回复

Python子进程Popen没有向shell发送所有参数

我正在使用Python的子进程模块来启动另一个程序。 该程序需要一个参数'-c {0-7}'。 在C ++程序中,我正在检查传入的参数: 这是我运行python脚本时的输出: 很明显,参数'-c3'没有传递给子进程。 有什么想法吗?
1回复

Python子进程.Popen通过管道进行通信

我希望能够使用Popen.communicate并将stdout记录到文件中(除了从communicate()返回的以外communicate() 。 这就是我想要的-但这真的是个好主意吗? 与此相关的任何问题,看一下沟通的暗示,看起来都不错。 但是有更好的方法吗?