我是python的新手,我需要在课程中使用它。我在Freemat / octave / matlab .m文件中开发了解决方案(一种优化算法),并希望从Python调用它(python代码将由一个评分python脚本调用)。
.m文件读取名为tmp.data的文件,并将输出写入output.txt。然后,python脚本应该从该输出中读取并将其转换为分级脚本所期望的结果。
所有运行正常,但我无法使Python等待对Matlab的调用完成,因此在以下行中生成错误。
以下是代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from collections import namedtuple
Item = namedtuple("Item", ['index', 'value', 'weight'])
import subprocess
import os
from subprocess import Popen, PIPE
def solve_it(input_data):
# Modify this code to run your optimization algorithm
# Write the inputData to a temporay file
tmp_file_name = 'tmp.data'
tmp_file = open(tmp_file_name, 'w')
tmp_file.write(input_data)
tmp_file.close()
# call matlab (or any other solver)
# subprocess.call('matlab -r gp(\'tmp.data\')', shell=1)
# run=os.system
# a=run('matlab -r gp(\'tmp.data\')')
# process = Popen('matlab -r gp(\'tmp.data\')', stdout=PIPE)
# Popen.wait()
# (stdout, stderr) = process.communicate()
subprocess.call('matlab -r gp(\'tmp.data\')',shell=0)
# Read result from file
with open('output.txt') as f:
result = f.read()
# remove the temporay file
os.remove(tmp_file_name)
os.remove('output.txt')
return result
# return stdout.strip()
# prepare the solution in the specified output format
# output_data = str(value) + ' ' + str(0) + '\n'
# output_data += ' '.join(map(str, taken))
# return output_data
import sys
if __name__ == '__main__':
if len(sys.argv) > 1:
file_location = sys.argv[1].strip()
input_data_file = open(file_location, 'r')
input_data = ''.join(input_data_file.readlines())
input_data_file.close()
print solve_it(input_data)
else:
print 'This test requires an input file. Please select one from the data directory. (i.e. python solver.py ./data/ks_4_0)'
如您所见,我尝试过subprocess.call,popen,os.system ......无济于事。所有这些都给了我类似的错误:
C:\Users\gp\Documents\Documents\personal\educacion\Discrete Optimization\knapsack>python2 solver.py data/ks_19_0
Traceback (most recent call last):
File "solver.py", line 60, in <module>
print solve_it(input_data)
File "solver.py", line 30, in solve_it
with open('output.txt') as f:
IOError: [Errno 2] No such file or directory: 'output.txt'
当然!当 matlab仍处于打开过程时出现错误。因此,它试图访问尚未创建的文件。
我应该怎么做才能让Python等待Matlab 完成 ??
感谢您的帮助,谢谢。
答案 0 :(得分:6)
[记录]
正如丹尼尔指出的那样,通过在matlab调用中引入几个选项来解决它:
subprocess.call('matlab -nosplash -wait -r "gp(\'tmp.data\')"',shell=0)
之后,它跑得很漂亮。
由于
答案 1 :(得分:4)
你的代码似乎不知道matlab使用启动器(matlab_root / bin / matlab.exe)和主应用程序(matlab_root / bin / xxx / matlab.exe)这一事实。要在主应用程序关闭之前保持启动器处于打开状态,您必须使用-wait
选项。