等待Ubuntu CSH shell完成操作/返回代码的Python命令

3
我正在运行一个Python命令+API来访问ECMWF(欧洲中期天气预报中心)数据服务器(称为MARS)并下载一些文件(天气数据)。我使用shell(我正在使用csh)通过在shell中执行./python_script.py来启动Python代码。
如果我下载单个文件(将脚本中的年份设置为1999,而不是下面失败的Python脚本中的range(1998, 2000)),它可以正常运行。现在我想下载多个文件,因此对年份进行循环。
我的问题是,似乎Python脚本没有等待Shell命令/ API完成,就继续执行下一年份。这会导致错误。文件已生成,但大小为零。
我想知道是否可以指定Python脚本在继续进行下一次for / loop步骤之前等待在shell窗口中找到某些关键字。
我知道我在这种情况下正在使用一些特定的API,可能可以找到另一种API特定的解决方案,但我认为通过识别shell中的一些打印输出更容易。
例如,它可以是“传输速率”,该速率似乎仅在作业完成后出现在shell窗口中,请参见我保存在shell中的日志(最后几行)(使用./python_script.py >& log_file.log)。
我的Python代码如下:
#!/usr/bin/env python
for year in range(1998, 2000):
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
server.retrieve({
    "class": "e2",
    "dataset": "era20c",
    "date": '%d-07-01/%d-07-02' % (year,year),
    "domain": "g",
    "area" : "12/-72/-67/22",
    "grid" : "1.0/1.0",
    "expver": "1",
    "param": "214.140/233.140",
    "step": "3/9/15/21",
    "format" : "netcdf",
    "stream": "wave",
    "target": '/home/nicolas/hycom/hycom_data/ECMWF/ERA20C/forecast/%d/test_era20c_wave_set1.nc' % (year),
    "time": "06",
    "type": "fc",
})

我只展示下载某个文件时的日志最后几行(成功):

2016-02-13 16:00:21 Request is complete
2016-02-13 16:00:21 Transfering 239.441 Kbytes into /home/nicolas/hycom/hycom_data/ECMWF/ERA20C/forecast/1999/test_era20c_wave_set1.nc
2016-02-13 16:00:21 From http://stream.ecmwf.int/data/atls04/data/data01/scratch/_grib2netcdf-atls04-95e2cf679cd58ee9b4db4dd119a05a8d-JLUk0w.nc
2016-02-13 16:00:28 Transfer rate 32.6278 Kbytes/s

你确定所有年份都有数据吗?如果你尝试使用 range(1998,1999),它是否有效? - Arton Dorneles
嗨,Arton,感谢您的快速回答,是的,有数据,并且使用range(1998,1999)正常工作。 - Nicolas
1个回答

1

不需要在循环中导入,这可能是缩进问题。如果您提供的脚本如此,那么retrieve不在循环中。Python中的缩进非常重要。

尝试以以下方式重写脚本:

#!/usr/bin/env python
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
for year in range(1998, 2000):
    server.retrieve({
        "class": "e2",
        "dataset": "era20c",
        "date": '%d-07-01/%d-07-02' % (year,year),
        "domain": "g",
        "area" : "12/-72/-67/22",
        "grid" : "1.0/1.0",
        "expver": "1",
        "param": "214.140/233.140",
        "step": "3/9/15/21",
        "format" : "netcdf",
        "stream": "wave",
        "target": '/home/nicolas/hycom/hycom_data/ECMWF/ERA20C/forecast/%d/test_era20c_wave_set1.nc' % (year),
        "time": "06",
        "type": "fc",
    })

嗨,Nikita,感谢你的回答,社区的快速帮助令人印象深刻... 我有一些缩进问题(我复制错了),但是在for循环行和第一条(缩进的)命令行之间也有一些空格。实际上,我发现没有指定结束命令很奇怪...这可以通过缩进敏感性来解释。我进行了更改,现在它可以工作了!!! 你太棒了,再次感谢。 - Nicolas
@Nicolas,很高兴能帮到你!你可能想将答案接受为解决方案,请参见http://stackoverflow.com/help/someone-answers。 - Nikita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接