Захват сообщений, записанных в sys.stderr или sys .stdout, безусловно, возможен (или можно также добавить управление предупреждениями, как предложил @MichaelDelgado):
Код: Выделить всё
import sys
from io import StringIO
import xarray as xr
url = "http://nomads.ncep.noaa.gov:80/dods/gefs/gefs20220909/gec00_00z_pgrb2a"
try:
sys.stderr = err = StringIO()
ds = xr.open_dataset(url_not_exist)
print(ds.dims)
except OSError as ose:
print(f"Error Log = {ose}", file=sys.stderr)
finally:
sys.stderr = sys.__stderr__
if err.tell() > 0:
err.seek(0)
print(f"Additional Info: " + err.read())
Код: Выделить всё
Frozen({'ens': 1, 'time': 65, 'lev': 12, 'lat': 361, 'lon': 720})
Additional Info: /home/workspace/.venv/lib/python3.8/site-packages/xarray/coding/times.py:144: SerializationWarning: Ambiguous reference date string: 1-1-1 00:00:0.0. The first value is assumed to be the year hence will be padded with zeros to remove the ambiguity (the padded reference date string is: 0001-1-1 00:00:0.0). To remove this message, remove the ambiguity by padding your reference date strings with zeros.
warnings.warn(warning_msg, SerializationWarning)
Но...
В других случаях перенаправление stderr не имеет никакого эффекта. Например, когда URL-адрес ссылается на несуществующий ресурс.
Установка url = "http://nomads.ncep.noaa.gov:80/dods/gef ... 00z_pgrb2a" и выполнение тот же код дает:
Код: Выделить всё
oc_open: server error retrieving url: code=0 message="/gefs/asdf/gec00_00z_pgrb2a is not an available dataset"
Additional Info: Error Log = [Errno -70] NetCDF: DAP server error: b'http://nomads.ncep.noaa.gov:80/dods/gefs/asdf/gec00_00z_pgrb2a'
Я хочу понять, что здесь происходит. Создает ли xarray подпроцесс, который понятия не имеет о ситуации с sys.stderr? Как я могу правильно регистрировать эти сообщения или, по крайней мере, избегать того, чтобы они загромождали консоль?
Подробнее здесь: https://stackoverflow.com/questions/736 ... en-dataset