包含相关数据的字符串通过 Popen 函数和标准输出从子进程发送。
run = subprocess.Popen('evo -x "' + folder+filename+'"', stdout = subprocess.PIPE, stderr = subprocess.PIPE, env={'LANG':'C++'})
data, error = run.communicate()
打印相关信息的字符串如下所示:
printf "height= %.15f \ntilt = %.15f (%.15f)\ncen_volume= %.15f\nr_volume= %.15f\n", height, abs(sin(tilt*pi/180)*ring_OR), abs(tilt), c_vol, r_vol;
并输出到控制台print data
(在标准输出中还有一些额外的东西):
Evolver 2.40, May 8, 2072; Windows OpenGL, 32-bit
Converting to all named quantities...Done.
Enter command: QUIET
height= 0.000211813357854
tilt=0.0 (0.0)
cen_volume= 0.000000000600000
r_volume= 0.000000003000000
bad
我将它与:
dat = re.match("[\s]*height\s*=\s*([-]?[\.\d]*)[\s]*tilt\s*=\s*([-]?[\.\d]*)[\s]*\(([\s]*[-]?[\.\d]*)\)[\s]*cen_volume\s*=\s*([-]?[\.\d]*)[\s]*r_volume\s*=\s*([-]?[\.\d]*)[\s]*", data)
但是,这将返回“无”。这个完全相同的 .match 用于在从 txt 文件而不是 stdout 读取后匹配完全相同信息的程序中,并且在这种情况下可以完美运行。当通过通信检索字符串时,处理字符串的方式是否存在异常,或者添加了一些不寻常的额外不可见字符?请注意, .findall 非常适合匹配re.findall("[\s]*(bad)[\s]*", data)
,但即使尝试仅匹配一行与 .match 仍然失败。