从Python调用Matlab时出现数据库物种匹配失败问题求助
问题描述
背景信息
通过Python的matlab.engine调用第三方提供的Matlab脚本,实现化学物种向量与数据库的匹配检索,核心检索逻辑由外部团队开发。
物种向量示例
'O2 ','N2 ','H2O ','CO2 ','NH3 ','CH4 ','CO ','H2 ','H2S ' 0.0000002 0.5 0.02 0.47 0.000000001 0.01 0.001 0.0001 3.13e-5
数据库示例(片段)
... H2 33.19 1.313 -0.216 H2O 647.096 22.064 0.3449 H2O2 730.155 21.7 .358233 H2S 373.53 8.963 0.0942 NH3 405.65 11.28 0.2526 N2 126.2 3.4 0.0377 O2 154.58 5.043 0.0222 ...
检索核心代码片段
q = size(n); if q(1)>q(2) n=n'; end for q = 1:length(names) % 遍历传入的每个物种 index(q) = searchDataB(names(q)); % 获取物种在数据库中的索引 if index(q) == -1 % 若未找到则抛出异常 throw(MException('Catling:missingSpecies',['Species ' names{q} ' is missing from the database.'])) end %disp(['Using species: ' names(q)]) % 显示正在使用的物种
报错信息
Species N2 is missing from the database. Error in Gibbs_energy_minimization>totalGibbsInternal (line 137) lnPhi = fugCoef(T,P,onlyPhase(1,names),onlyPhase(1,n')); Error in Gibbs_energy_minimization (line 69) G1=totalGibbsInternal(n_true); % Calculate the total Gibbs energy of the true initial state. Error in Main_script_iterate (line 27) vals=[vals; n Gibbs_energy_minimization(n')]; % run the Gibbs energy minimization routine and store the output in the vals array Traceback (most recent call last): File "/home/tessa/Alien Earths/phi_calc/phi calc.py", line 181, in <module> phi=eng.Main_script_iterate() File "/usr/local/lib/python3.10/dist-packages/matlab/engine/matlabengine.py", line 71, in __call__ _stderr, feval=True).result() File "/usr/local/lib/python3.10/dist-packages/matlab/engine/futureresult.py", line 62, in result return self.__future.result(timeout) File "/usr/local/lib/python3.10/dist-packages/matlab/engine/fevalfuture.py", line 76, in result self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err) matlab.engine.MatlabExecutionError: File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/fugCoef.m, line 32, in fugCoef File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/Gibbs_energy_minimization.m, line 137, in totalGibbsInternal File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/Gibbs_energy_minimization.m, line 69, in Gibbs_energy_minimization File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/Main_script_iterate.m, line 27, in Main_script_iterate Species N2 is missing from the database.
异常现象:仅'O2 '和'H2O '能正常匹配;本地Linux Mint系统的Matlab直接运行脚本也报错,但Matlab Online运行正常。
问题分析与解决方案
核心原因
问题本质是物种名称字符串的首尾空格匹配不一致:
- 物种向量中的每个名称都带有末尾空格(如
'N2 '含1个末尾空格,'O2 '含2个末尾空格),但数据库中对应物种名称后的空格数量与向量不匹配(如N2后是2个空格)。 searchDataB函数采用精确字符串匹配,空格数量不一致时直接匹配失败。- Matlab Online默认对读取的字符串做了自动去空格处理(类似
strtrim),而本地Matlab版本或数据库读取逻辑未做此处理,导致环境差异。
解决方案
方案1:修改Matlab检索代码,自动去除首尾空格
在调用searchDataB前,对每个物种名称执行strtrim(),去除首尾多余空格:
for q = 1:length(names) % 去除名称首尾空格后再检索 trimmed_name = strtrim(names(q)); index(q) = searchDataB(trimmed_name); if index(q) == -1 throw(MException('Catling:missingSpecies',['Species ' trimmed_name ' is missing from the database.'])) end end
方案2:在Python端预处理物种名称
在Python构造物种名称向量时,先对每个字符串做strip处理,去除首尾空格后再传入Matlab:
# 假设原物种名称列表为species_names trimmed_species = [name.strip() for name in species_names] # 将处理后的名称传入Matlab引擎
方案3:修正数据库读取逻辑
检查数据库读取的Matlab代码,确保读取物种名称时自动去除首尾空格。例如使用textscan读取时:
fid = fopen('database.txt','r'); data = textscan(fid,'%s %f %f %f'); fclose(fid); % 对物种名称列去空格 data{1} = strtrim(data{1});
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

