使用Python执行外部命令和交换变量

时间:2016-03-24 14:49:00

标签: python linux loops terminal netcdf

1。引言

我有一堆 netcdf 格式的文件。 每个文件包含不同时期某个地方的气象条件(每小时数据) 我需要为每个文件提取前12小时的数据。所以我选择使用NCO(netcdf运算符)来处理。

NCO 适用于终端环境。使用>ncks -d Time 0,11 input.nc output.nc,我可以获得一个名为out.nc的数据文件,其中包含in.nc的前12h数据。

2。我的尝试

我想在ipython笔记本中保留所有进程。但我坚持两个方面。

  
      
  1. 如何在python循环中执行终端代码

  2.   
  3. 如何将python中的字符串传递给终端代码。

  4.   

这是我的假代码。

files = os.listdir('.')
for file in files:
    filename,extname = os.path.splitext(file)
    if extname == '.nc':   
        output = filename + "_0-12_" + extname
        ## The code below was my attempt
        !ncks -d Time 0,11 file output` 

3。结论

基本上,我的目标是让假代码!ncks -d Time 0,11 file output成真。这意味着:

  1. 直接在python循环中执行netcdf运算符...
  2. ...使用filename这是python环境中的字符串。
  3. 抱歉我的问题不明确。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:2)

您可以使用subprocess.check_output执行外部程序:

import glob
import subprocess

for fn in glob.iglob('*.nc'):
    filename, extname = os.path.splitext(fn)
    output_fn = filename + "_0-12_" + extname
    output = subprocess.call(['ncks', '-d', 'Time', '0,11', fn, output_fn])
    print(output)

注意:更新代码以使用glob.iglob;您无需手动检查扩展程序。

答案 1 :(得分:2)

您也可以查看pynco,它使用子进程调用包装NCO,类似于@fatetru的答案。您的应用程序可能类似于

nco = Nco()
for fn in glob.iglob('*.nc'):
    filename, extname = os.path.splitext(fn)
    output_fn = filename + "_0-12_" + extname
    nco.ncks(input=filename, output=output_fn, dimension='Time 0,11')