Unidata / MetPy

MetPy is a collection of tools in Python for reading, visualizing and performing calculations with weather data.
https://unidata.github.io/MetPy/
BSD 3-Clause "New" or "Revised" License
1.26k stars 415 forks source link

Metpy 1.6.2 seems incompatible with xarray 2024.9.0 #3651

Open sgofferj opened 3 weeks ago

sgofferj commented 3 weeks ago

What went wrong?

When using metpy 1.6.3 with xarray 2024.9.0, importing metpy fails

I'm building a docker container with this requirements.txt:

numpy
matplotlib
pandas
xarray
metpy
cartopy
requests
cfgrib
eccodes

Until a couple of days ago, my app would work fine. It still builds fine but when I run it it fails as described below. On my desktop with xarray 2024.6.0 and metpy 1.6.2, the app runs fine.

Packages in docker container:

Package            Version
------------------ -----------
appdirs            1.4.4
attrs              24.2.0
Cartopy            0.24.1
certifi            2024.8.30
cffi               1.17.1
cfgrib             0.9.14.1
charset-normalizer 3.4.0
click              8.1.7
contourpy          1.3.0
cycler             0.12.1
eccodes            2.38.1
findlibs           0.0.5
flexcache          0.3
flexparser         0.3.1
fonttools          4.54.1
idna               3.10
kiwisolver         1.4.7
matplotlib         3.9.2
MetPy              1.6.3
numpy              2.1.2
packaging          24.1
pandas             2.2.3
pillow             10.4.0
Pint               0.24.3
pip                24.2
platformdirs       4.3.6
pooch              1.8.2
pycparser          2.22
pyparsing          3.1.4
pyproj             3.7.0
pyshp              2.3.1
python-dateutil    2.9.0.post0
pytz               2024.2
requests           2.32.3
scipy              1.14.1
shapely            2.0.6
six                1.16.0
traitlets          5.14.3
typing_extensions  4.12.2
tzdata             2024.2
urllib3            2.2.3
xarray             2024.9.0

Operating System

Linux

Version

1.6.3

Python Version

3.13.0

Code to Reproduce

import metpy.calc as mpcalc from metpy.units import units

Errors, Traceback, and Logs

Traceback (most recent call last):

File "/app/main.py", line 2, in

import functions as func

File "/app/functions.py", line 5, in

import metpy.calc as mpcalc

File "/venv/lib/python3.13/site-packages/metpy/init.py", line 13, in

from .xarray import *  # noqa: F401, F403, E402

^^^^^^^^^^^^^^^^^^^^^

File "/venv/lib/python3.13/site-packages/metpy/xarray.py", line 31, in

from .units import (_mutate_arguments, DimensionalityError, is_quantity, UndefinedUnitError,

                    units)

File "/venv/lib/python3.13/site-packages/metpy/units.py", line 26, in

import pint

File "/venv/lib/python3.13/site-packages/pint/init.py", line 18, in

from .delegates.formatter._format_helpers import formatter

File "/venv/lib/python3.13/site-packages/pint/delegates/init.py", line 12, in

from . import txt_defparser

File "/venv/lib/python3.13/site-packages/pint/delegates/txt_defparser/init.py", line 12, in

from .defparser import DefParser

File "/venv/lib/python3.13/site-packages/pint/delegates/txt_defparser/defparser.py", line 10, in

from . import block, common, context, defaults, group, plain, system

File "/venv/lib/python3.13/site-packages/pint/delegates/txt_defparser/common.py", line 23, in

@dataclass(frozen=True)

 ~~~~~~~~~^^^^^^^^^^^^^

File "/usr/local/lib/python3.13/dataclasses.py", line 1295, in wrap

return _process_class(cls, init, repr, eq, order, unsafe_hash,

                      frozen, match_args, kw_only, slots,

                      weakref_slot)

File "/usr/local/lib/python3.13/dataclasses.py", line 1043, in _process_class

raise TypeError('cannot inherit frozen dataclass from a '

                'non-frozen one')

TypeError: cannot inherit frozen dataclass from a non-frozen one

sgofferj commented 3 weeks ago

Actually, it seems, the problem is Python 3.13. After some more debugging, my application seems to run fine with latest metpy and latest xarray under Python 3.12.7

DWesl commented 3 weeks ago

Related question: what happens if you run import pint in the python environment where your app fails, without attempting to import MetPy or XArray? That appears three lines down from the MetPy import.

EDIT: reasoning: it looks like the problem is a conflict between pint and Python 3.13

sgofferj commented 3 weeks ago

I'll build a new bad one and test.

dopplershift commented 3 weeks ago

Yes, this is a known problem with pint on Python 3.13. I'm going to try to dig in further when I have the cycles. The only work-around right now is to use Python < 3.13.