背景
- 奇葩的项目需求,由于需要生成netcdf格式文件,于是特意去查了查,这家伙,老复杂了,是一种标准协议,用来存储气象相关信息的。
- 打开了github开始搜索相关库,c的,java的,python的,然后没了?没有nodejs版本的,去官网看了看,看来真的没有,于是向后端寻求帮助,结果我们的后端只会go和c#,事情一度卡在那里。我甩给后端,后端说做不了,没他熟悉的语言。我说这个前端也没有相应的库我也做不了。
- 后来老大直接下了死命令,说什么也要搞出来,于是一番博弈过后,苦差事落在了我的头上,于是再语言里面选择了最容易入门的python,开始自己学,学一点毛皮
node 模块child_process的exce
- node 拥有子进程这个概念,父进程可以额外的执行子进程,并能监听子进程的状态
- 子进程可以执行终端指令,这也是我们的突破口,利用子进程执行终端命令,利用终端命令来执行python文件
const exec = require("child_process").exec;
exec(`C:\\Users\\xuji\\AppData\\Local\\Programs\\Python\\Python310\\python.exe "${path.resolve(getPath('/writeNC.py'))}"`,(err,s,a)=>{
})
python 的实现
- 由于是终端执行的python命令,好多参数拼接会有问题,于是采用了读本指定路径下json文件的方式去读取数据,并且读取最终产物写入位置
- 具体流程为:判断环境=》读取json文件=》解析处理json格式为python可用=》利用netCDF4创建文件=》文件数据写入=》完成
for name in data:
# print(name,'name')
nc_fid2=Dataset(name['path'] + "/test"+ str(i) + '.nc', 'w',format="NETCDF3_CLASSIC")
nc_fid2.createDimension('FloatA',len(name["FloatA"]))
nc_fid2.createDimension('FloatB',len(name["FloatB"]))
nc_fid2.createDimension('FloatC',len(name["FloatC"]))
nc_fid2.createDimension('FloatD',len(name["FloatD"]))
nc_fid2.createDimension('FloatE',len(name["FloatE"]))
nc_fid2.createDimension('depth',1)
nc_fid2.createDimension('time',1 )
nc_fid2.createDimension('aa',1 )
#额外参数
nc_fid2.TimeAt = name['TimeAt']
nc_fid2.HAngle = name['HAngle']
nc_fid2.VAngle = name['VAngle']
nc_fid2.BeginAngle = name['BeginAngle']
nc_fid2.EndAngle = name['EndAngle']
nc_fid2.Longitude = name['Longitude']
nc_fid2.Latitude = name['Latitude']
nc_fid2.Humidity = name['Humidity']
nc_fid2.BeginAngle = name['BeginAngle']
#创建文件变量
FloatA_Arys = nc_fid2.createVariable('FloatA', 'f4', ('FloatA',))
FloatB_Arys = nc_fid2.createVariable('FloatB', 'f4', ('FloatB',))
FloatC_Arys = nc_fid2.createVariable('FloatC', 'f4', ('FloatC',))
FloatD_Arys = nc_fid2.createVariable('FloatD', 'f4', ('FloatD',))
FloatE_Arys = nc_fid2.createVariable('FloatE', 'f4', ('FloatE',))
depth = nc_fid2.createVariable("depth","f8",("depth",))
times = nc_fid2.createVariable("time","f8",("time",))
#参数复制
FloatA_Arys[:] = name["FloatA"][:]
FloatB_Arys[:] = name["FloatB"][:]
FloatC_Arys[:] = name["FloatC"][:]
FloatD_Arys[:] = name["FloatD"][:]
FloatE_Arys[:] = name["FloatE"][:]
nc_fid2.close()
i = i + 1