【问题标题】:Execute external command and exchange variable using Python使用 Python 执行外部命令和交换变量
【发布时间】:2016-07-12 05:06:49
【问题描述】:

1。简介

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

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

2。我的尝试

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

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

  2. 如何将python中的字符串转入终端代码。

例如,这是我的假代码。

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环境中的一个字符串。

抱歉我的问题不清楚。任何建议将不胜感激!

【问题讨论】:

  • "...input.nc output.nc,我可以得到一个名为 out.nc 的数据文件,其中包含 in.nc 的前 12 小时数据" 我可以假设这种文件不一致是错字吗?
  • 你看过os.systemsubprocess.callsys.argv吗?
  • 我试过os.system("my command here")subprocess.call([])。他们都未能实现。
  • 我的意思是你看过文档吗,subprocess.call 不会让你只使用ncks 而不指定完整路径或shell=True
  • 谢谢你们!我在 ipython notebook 环境中尝试过subprocess.callsubprocess.check_output。第二个有效。但它们都在 python 控制台中运行良好。

标签: python linux loops terminal netcdf


【解决方案1】:

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

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')

【讨论】:

  • 感谢您的回答!
【解决方案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;你不需要手动检查扩展。

【讨论】:

  • 你可以使用files = glob('*.nc')
  • 感谢您的回答。我已经尝试过了,但它似乎不起作用。
  • @NizamMohamed,感谢您的评论。我更新了代码以使用glob.iglob
  • @HanZhengzu,怎么不行?如果您提供更多详细信息会很好。
  • 进行测试,直接使用subprocess.call(['ncks', '-d', 'Time', '0,11', "test.nc", "output.nc"])。 python 控制台返回> 1。但是使用!ncks -d Time,0,11 test.nc output.nc 可以。
猜你喜欢
  • 2017-10-03
  • 2013-04-16
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
相关资源
最近更新 更多