第3章:脚本语言入门:Python基础回顾、常用库介绍(numpy, matplotlib)、Python与MATLAB的交互

好,咱们进入第三章。说实话,很多做MIL测试的老工程师,一听到「Python」就头大。我当年也一样,觉得MATLAB才是王道。但后来发现,Python在自动化脚本这块,确实有它不可替代的优势。尤其是当你需要批量处理数据、快速画图、或者跟其他工具做集成的时候,Python的轻便和生态会让你爱不释手。

这一章,我不打算给你讲Python的语法大全。那玩意儿网上到处都是。我重点讲几个你在MIL测试脚本里真正会用到的点,以及我踩过的坑。

3.1 Python基础回顾:够用就行

你不需要成为Python高手。你只需要能看懂、能改、能跑。我个人的习惯是,把Python当成一个「高级计算器+胶水工具」。

核心数据类型:列表、字典、元组。这三个你玩明白,基本就够用了。

  • 列表:用来存测试数据序列。比如你采集到的100个电压值。
  • 字典:用来存带标签的数据。比如{'time': [0,1,2], 'voltage': [3.3, 3.4, 3.5]}。
  • 元组:用来存固定配置。比如(采样率, 通道号),这玩意儿不能改,安全。

避坑指南:我曾经在循环里直接修改列表的长度,结果导致索引越界。记住,遍历列表时不要增删元素。要么用列表推导式,要么新建一个列表。

控制流:for循环和if判断。你写脚本时,90%的逻辑都是「如果...就...」和「对每个数据...」。别整花里胡哨的递归,MIL测试脚本讲究的是可读性和稳定性。

# 一个典型的MIL数据筛选片段
raw_data = [1.2, 3.4, 5.6, 7.8, 9.0]
valid_data = []
for value in raw_data:
    if 2.0 <= value <= 8.0:  # 阈值判断
        valid_data.append(value)
print(valid_data)  # 输出 [3.4, 5.6, 7.8]

你看,就这么简单。别怕。

3.2 常用库介绍:numpy 和 matplotlib

这两个库,是Python在工程领域立足的根本。我刚开始用Python做MIL测试时,就是靠numpy处理矩阵,靠matplotlib画波形图。

3.2.1 numpy:矩阵运算的瑞士军刀

说白了,numpy就是Python版的MATLAB矩阵运算。你想想看,MIL测试里最常干的事是什么?对着一堆时间序列数据做加减乘除、求均值、找峰值。用原生Python列表做这些事,慢得你想哭。用numpy,一行代码搞定。

功能 原生Python numpy
数组加法 循环逐个加 arr1 + arr2
求均值 sum/len np.mean(arr)
条件筛选 列表推导式 arr[arr > 5]

我个人习惯,只要数据量超过100个点,一律用numpy。为什么?因为快。我在项目中遇到过,用原生列表处理10万个采样点,跑了3秒多。换成numpy,0.1秒不到。你想想看,自动化测试跑一晚上,省下来的时间够你喝几杯咖啡了。

import numpy as np

# 模拟MIL测试中的传感器数据
time = np.linspace(0, 1, 1000)  # 0到1秒,1000个点
signal = np.sin(2 * np.pi * 50 * time) + 0.1 * np.random.randn(1000)  # 50Hz正弦波加噪声

# 找峰值(简单阈值法)
peaks = signal[signal > 0.8]
print(f"找到 {len(peaks)} 个峰值点")

小技巧:numpy的广播机制很强大。比如你有一个1000x10的矩阵,想给每一列加一个不同的偏移量,直接加一个1x10的向量就行。不用写循环。我第一次用这个特性时,感觉打开了新世界的大门。

3.2.2 matplotlib:画图给老板看

做MIL测试,你不光要跑数据,还要出报告。matplotlib就是干这个的。我见过太多人,数据跑出来了,但画出来的图丑得没法看。其实你只需要掌握几个核心函数,就能画出专业级的波形图。

import matplotlib.pyplot as plt

# 画一个简单的时域波形
plt.figure(figsize=(10, 4))
plt.plot(time, signal, label='实测信号', color='blue', linewidth=0.8)
plt.axhline(y=0.8, color='red', linestyle='--', label='阈值线')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (V)')
plt.title('MIL测试信号分析')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

嗯,这里要注意。matplotlib默认的字体是英文的,如果你要显示中文标签,记得加一行:plt.rcParams['font.sans-serif'] = ['SimHei']。我曾经因为这个被领导批评过,说图里的中文全是乱码。从那以后,我每次画图第一件事就是设置字体。

3.3 Python与MATLAB的交互

我知道,很多公司现有的MIL测试流程还是基于MATLAB的。你不可能一下子全换成Python。怎么办?让它们俩配合着干活。

方案一:通过文件交换数据

这是最笨但最稳定的方法。Python算完结果,存成.mat文件(用scipy库),然后MATLAB读进去。反过来也一样。

# Python端保存数据
import scipy.io as sio
data_dict = {'time': time, 'signal': signal}
sio.savemat('test_data.mat', data_dict)

# MATLAB端读取
% load('test_data.mat');
% plot(time, signal);

我在项目中遇到过,有些老工程师就认这个方式。简单、可靠、不出错。你想想看,如果因为交互接口出问题导致测试失败,那才叫得不偿失。

方案二:通过MATLAB Engine API直接调用

如果你需要实时交互,可以用这个。Python里直接调用MATLAB的函数。但说实话,我建议你慎用。为什么?因为环境配置太容易出问题了。32位和64位不匹配、Python版本不对、MATLAB版本不对,任何一个都能让你折腾半天。

import matlab.engine
eng = matlab.engine.start_matlab()
result = eng.sqrt(4.0)  # 调用MATLAB的sqrt函数
print(result)  # 输出 2.0
eng.quit()

警告:MATLAB Engine API的安装需要MATLAB R2014b及以上版本,并且Python版本必须与MATLAB兼容。我曾经在Windows 10上折腾了整整一个下午,最后发现是Python 3.9和MATLAB R2018a不兼容。建议你直接用方案一,省心。

方案三:通过系统命令调用

Python用subprocess模块,直接调用MATLAB的批处理模式。这种方式适合「一键跑完」的场景。比如你写一个Python脚本,里面循环调用MATLAB跑不同的测试用例。

import subprocess
# 调用MATLAB执行test_script.m,不显示图形界面
subprocess.run(['matlab', '-batch', 'run("test_script.m")'], capture_output=True)

我个人习惯用方案一和方案三。方案二嘛,除非你特别需要实时交互,否则别碰。你想想看,自动化测试脚本最重要的是什么?是稳定。一个动不动就报环境错误的脚本,谁敢用它跑通宵?

小结

这一章,我带你回顾了Python在MIL测试中最常用的几个点。说白了,就是numpy处理数据、matplotlib画图、以及跟MATLAB和平共处。你不需要成为Python专家,但你需要知道怎么用这些工具解决实际问题。

下一章,我们会正式进入脚本开发的核心——如何设计一个可复用的测试框架。到时候,你会发现今天学的这些基础,全都能用上。