Tengo datos meteorológicos (json) de api. Quiero mostrar solo una parte que puse en un diccionario:
vals = { 'temperature': 34.41, 'summary': 'Clear', 'ozone': 249.95, 'humidity': 0.32, 'precipType': 'rain', 'pressure': 1010.05, 'dewPoint': 15.31, 'time': 1456393033, 'windSpeed': 2.5, 'apparentTemperature': 34.23, 'icon': 'clear-day', 'windBearing': 96, 'precipProbability': 0.01, 'cloudCover': 0.17, 'precipIntensity': 0.0203 }Uso este código para mostrar la notificación en el formato de 'clave: valor'. El código sigue:
for i in sorted(vals.keys()): if i == 'time': vals[i] = datetime.datetime.fromtimestamp(int(vals[i])) #unix timestamp to readble format if i == 'summary': continue #Put it in the notif's title not body msg = msg + str(i).strip() + ':\ ' +str(vals[i]).strip() + '\n' msg = 'notify-send -u critical ' + vals['summary'] + ' ' + msg os.system(msg)La salida muestra una notificación con el título (en este caso, el resumen- 'Borrar') y el primer par clave:valor, es decir, temperatura aparente: 34.23 y luego el terminal muestra el siguiente error:
sh: 2: cloudCover: 0.17: not found sh: 3: dewPoint: 15.31: not found sh: 4: humidity: 0.32: not found sh: 5: icon: clear-day: not found sh: 6: ozone: 249.95: not found sh: 7: precipIntensity: 0.0203: not found sh: 8: precipProbability: 0.01: not found sh: 9: precipType: rain: not found sh: 10: pressure: 1010.05: not found sh: 11: temperature: 34.41: not found sh: 12: time: 2016-02-25: not found sh: 13: windBearing: 96: not found sh: 14: windSpeed: 2.5: not found¿Cuál es el error y cómo lo corrijo?
El error está en msg = 'notify-send -u critical ' + vals['summary'] + ' ' + msg . Tu sh piensa que los argumentos vals['summary'] y msg son comandos para ejecutar por sh . Ocurre debido a los espacios en la salida de su msg (no le estoy diciendo acerca de la confusión relacionada con los mismos nombres de sus msg de mensaje).
Puede evitarlo usando comillas ( \" ) en sus datos de salida. Así que msg puede verse como
msg = 'notify-send -u critical \"%s %s\"' %% (vals['summary'], msg)o
msg = 'notify-send -u critical ' + '\"' + vals['summary'] + ' ' + msg + '\"'UPD No entiendo la pregunta principal anterior, entonces:
Hay algunos problemas al usar las secuencias de comandos notify-send de varias líneas. Creo que la forma más fácil es usar echo -e en su secuencia de comandos, por ejemplo:
notify-send "Title" "$(echo -e "This is the first line.\nAnd this is the second.")"Puede intentar usar este pensamiento en su guión, pero tiene que hacer algunos trucos con comillas y caracteres de control.