Estoy ejecutando un comando de Python + API para acceder al servidor de datos ECMWF (Centro Europeo para el Pronóstico del Tiempo de Rango Medio) (llamado MARS) y descargar algunos archivos (datos meteorológicos). Ejecuto el código de Python con shell (estoy usando csh) haciendo ./python_script.py en el shell
Funciona bien si descargo un solo archivo (año 1999 con range(1999, 2000) en mi secuencia de comandos, en lugar de range(1998, 2000) en el siguiente ejemplo fallido de secuencia de comandos de Python). Ahora quiero descargar muchos de ellos y así hacer un bucle a lo largo de los años.
Mi problema es que parece que la secuencia de comandos de Python no espera a que finalicen los comandos de shell / API y continúe el próximo año. Da como resultado errores. El archivo se produce pero con tamaño cero.
Me gustaría saber si puedo especificar la secuencia de comandos de Python para esperar a encontrar algunas palabras clave en la ventana de shell antes de continuar con el siguiente paso for/loop.
Sé que estoy usando alguna API específica en ese caso y probablemente podría encontrar otra solución específica de API para hacerlo, pero me parece más fácil identificar alguna impresión en el shell.
Podría ser, por ejemplo, "Tasa de transferencia", que parece aparecer en la ventana de shell solo cuando se ha realizado el trabajo, vea el registro (últimas líneas exitosas) que he guardado desde shell (con ./python_script.py >& log_file.log
MI CÓDIGO PYTHON ES:
#!/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", })MI REGISTRO ÚLTIMAS LÍNEAS PARA LA DESCARGA DE UN ARCHIVO SOLAMENTE (EXITOSO):
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/sNo hay necesidad de importar en el ciclo, también podría ser un problema de sangría. Si su secuencia de comandos es como la proporcionó, entonces la retrieve no está en el bucle. La sangría en python importa mucho.
Intenta reescribir el script de esta manera:
#!/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", })