11import atexit
22import csv
3- import ctypes .util
4- import importlib
53import logging
64import os
75import platform
86import re
9- import sys
107import warnings
118from collections .abc import Iterable
129from itertools import product
3431from .docstring import _docstring_substitution_definitions
3532
3633
37- # Instruction to close /proc/mem at exit.
34+ # Instruction to close /proc/meminfo at exit.
3835def _close_proc_meminfo ():
3936 try :
4037 _meminfo_file .close ()
@@ -3134,34 +3131,6 @@ def _section(x, axes=None, stop=None, chunks=False, min_step=1):
31343131 return out
31353132
31363133
3137- def _get_module_info (module , alternative_name = False , try_except = False ):
3138- """Helper function for processing modules for cf.environment."""
3139- if try_except :
3140- module_name = None
3141- try :
3142- importlib .import_module (module )
3143- module_name = module
3144- except ImportError :
3145- if (
3146- alternative_name
3147- ): # where a module has a different (e.g. old) name
3148- try :
3149- importlib .import_module (alternative_name )
3150- module_name = alternative_name
3151- except ImportError :
3152- pass
3153-
3154- if not module_name :
3155- return ("not available" , "" )
3156- else :
3157- module_name = module
3158-
3159- return (
3160- importlib .import_module (module_name ).__version__ ,
3161- importlib .util .find_spec (module_name ).origin ,
3162- )
3163-
3164-
31653134def environment (display = True , paths = True ):
31663135 """Return the names and versions of the cf package and its
31673136 dependencies.
@@ -3188,97 +3157,84 @@ def environment(display=True, paths=True):
31883157
31893158 >>> cf.environment()
31903159 Platform: Linux-6.8.0-60-generic-x86_64-with-glibc2.39
3160+ Python: 3.12.8 /home/miniconda3/bin/python
3161+ packaging: 24.1 /home/miniconda3/lib/python3.12/site-packages/packaging/__init__.py
3162+ numpy: 2.2.6 /home/miniconda3/lib/python3.12/site-packages/numpy/__init__.py
3163+ cfdm.core: 1.12.2.0 /home/miniconda3/lib/python3.12/site-packages/cfdm/cfdm/core/__init__.py
3164+ packaging: 24.1 /home/miniconda3/lib/python3.12/site-packages/packaging/__init__.py
3165+ udunits2 library: libudunits2.so.0
31913166 HDF5 library: 1.14.2
31923167 netcdf library: 4.9.4-development
3193- udunits2 library: libudunits2.so.0
3194- esmpy/ESMF: 8.7.0 /home/miniconda/lib/python3.12/site-packages/esmpy/__init__.py
3195- Python: 3.12.8 /home/miniconda/bin/python
3196- dask: 2025.5.1 /home/miniconda/lib/python3.12/site-packages/dask/__init__.py
3197- netCDF4: 1.7.2 /home/miniconda/lib/python3.12/site-packages/netCDF4/__init__.py
3198- h5netcdf: 1.3.0 /home/miniconda/lib/python3.12/site-packages/h5netcdf/__init__.py
3199- h5py: 3.12.1 /home/miniconda/lib/python3.12/site-packages/h5py/__init__.py
3200- s3fs: 2024.12.0 /home/miniconda/lib/python3.12/site-packages/s3fs/__init__.py
3201- psutil: 6.1.1 /home/miniconda/lib/python3.12/site-packages/psutil/__init__.py
3202- packaging: 24.2 /home/miniconda/lib/python3.12/site-packages/packaging/__init__.py
3203- numpy: 2.2.2 /home/miniconda/lib/python3.12/site-packages/numpy/__init__.py
3204- scipy: 1.15.2 /home/miniconda/lib/python3.12/site-packages/scipy/__init__.py
3205- matplotlib: 3.10.0 /home/miniconda/lib/python3.12/site-packages/matplotlib/__init__.py
3206- cftime: 1.6.4.post1 /home/miniconda/lib/python3.12/site-packages/cftime/__init__.py
3207- cfunits: 3.3.7 /home/miniconda/lib/python3.12/site-packages/cfunits/__init__.py
3208- cfplot: 3.3.0 /home/miniconda/lib/python3.12/site-packages/cfplot/__init__.py
3209- cfdm: 1.12.2.0 /home/miniconda/lib/python3.12/site-packages/cfdm/__init__.py
3210- cf: NEXTVERSION /home/miniconda/lib/python3.12/site-packages/cf/__init__.py
3168+ netCDF4: 1.7.2 /home/miniconda3/lib/python3.12/site-packages/netCDF4/__init__.py
3169+ h5netcdf: 1.3.0 /home/miniconda3/lib/python3.12/site-packages/h5netcdf/__init__.py
3170+ h5py: 3.12.1 /home/miniconda3/lib/python3.12/site-packages/h5py/__init__.py
3171+ zarr: 3.0.8 /home/miniconda3/lib/python3.12/site-packages/zarr/__init__.py
3172+ s3fs: 2024.12.0 /home/miniconda3/lib/python3.12/site-packages/s3fs/__init__.py
3173+ scipy: 1.15.1 /home/miniconda3/lib/python3.12/site-packages/scipy/__init__.py
3174+ dask: 2025.5.1 /home/miniconda3/lib/python3.12/site-packages/dask/__init__.py
3175+ cftime: 1.6.4.post1 /home/miniconda3/lib/python3.12/site-packages/cftime/__init__.py
3176+ cfunits: 3.3.7 /home/miniconda3/lib/python3.12/site-packages/cfunits/__init__.py
3177+ cfdm: 1.12.2.0 /home/miniconda3/lib/python3.12/site-packages/cfdm/__init__.py
3178+ esmpy/ESMF: 8.7.0 /home/miniconda3/lib/python3.12/site-packages/esmpy/__init__.py
3179+ psutil: 6.1.1 /home/miniconda3/lib/python3.12/site-packages/psutil/__init__.py
3180+ matplotlib: 3.10.0 /home/miniconda3/lib/python3.12/site-packages/matplotlib/__init__.py
3181+ cfplot: 3.4.0 /home/miniconda3/lib/python3.12/site-packages/cfplot/__init__.py
3182+ cf: NEXTVERSION /home/miniconda3/lib/python3.12/site-packages/cf/__init__.py
32113183
32123184 >>> cf.environment(paths=False)
32133185 Platform: Linux-6.8.0-60-generic-x86_64-with-glibc2.39
3186+ Python: 3.12.8
3187+ packaging: 24.1
3188+ numpy: 2.2.6
3189+ cfdm.core: 1.12.2.0
3190+ packaging: 24.1
3191+ udunits2 library: libudunits2.so.0
32143192 HDF5 library: 1.14.2
32153193 netcdf library: 4.9.4-development
3216- udunits2 library: libudunits2.so.0
3217- esmpy/ESMF: 8.7.0
3218- Python: 3.12.8
3219- dask: 2025.5.1
32203194 netCDF4: 1.7.2
32213195 h5netcdf: 1.3.0
32223196 h5py: 3.12.1
3197+ zarr: 3.0.8
32233198 s3fs: 2024.12.0
3224- psutil: 6.1.1
3225- packaging: 24.2
3226- numpy: 2.2.2
3227- scipy: 1.15.2
3228- matplotlib: 3.10.0
3199+ scipy: 1.15.1
3200+ dask: 2025.5.1
32293201 cftime: 1.6.4.post1
32303202 cfunits: 3.3.7
3231- cfplot: 3.3.0
32323203 cfdm: 1.12.2.0
3204+ esmpy/ESMF: 8.7.0
3205+ psutil: 6.1.1
3206+ matplotlib: 3.10.0
3207+ cfplot: 3.4.0
32333208 cf: NEXTVERSION
32343209
32353210 """
3211+ # Get cfdm env
3212+ out = cfdm .environment (display = False , paths = paths )
3213+
3214+ _get_module_info = cfdm .functions ._get_module_info
32363215 dependency_version_paths_mapping = {
3237- # Platform first, then use an ordering to group libraries as follows...
3238- "Platform" : (platform .platform (), "" ),
3239- # Underlying C and Fortran based libraries first
3240- "HDF5 library" : (netCDF4 .__hdf5libversion__ , "" ),
3241- "netcdf library" : (netCDF4 .__netcdf4libversion__ , "" ),
3242- "udunits2 library" : (ctypes .util .find_library ("udunits2" ), "" ),
32433216 "esmpy/ESMF" : (
32443217 _get_module_info ("esmpy" , alternative_name = "ESMF" , try_except = True )
32453218 ),
3246- # Now Python itself
3247- "Python" : (platform .python_version (), sys .executable ),
3248- # Then Dask (cover first from below as it's important under-the-hood)
3249- "dask" : _get_module_info ("dask" ),
3250- # Then Python libraries not related to CF
3251- "netCDF4" : _get_module_info ("netCDF4" ),
3252- "h5netcdf" : _get_module_info ("h5netcdf" ),
3253- "h5py" : _get_module_info ("h5py" ),
3254- "s3fs" : _get_module_info ("s3fs" ),
32553219 "psutil" : _get_module_info ("psutil" ),
3256- "packaging" : _get_module_info ("packaging" ),
3257- "numpy" : _get_module_info ("numpy" ),
3258- "scipy" : _get_module_info ("scipy" ),
32593220 "matplotlib" : _get_module_info ("matplotlib" , try_except = True ),
3260- # Finally the CF related Python libraries, with the cf version last
3261- # as it is the most relevant (cfdm penultimate for similar reason)
3262- "cftime" : _get_module_info ("cftime" ),
3263- "cfunits" : _get_module_info ("cfunits" ),
32643221 "cfplot" : _get_module_info ("cfplot" , try_except = True ),
3265- "cfdm" : _get_module_info ("cfdm" ),
32663222 "cf" : (__version__ , _os_path_abspath (__file__ )),
32673223 }
32683224 string = "{0}: {1!s}"
32693225 if paths :
3270- # Include path information, else exclude, when unpacking tuple
3226+ # Include path information, else exclude, when unpacking tuple.
32713227 string += " {2!s}"
32723228
3273- out = [
3274- string . format ( dep , * info )
3275- for dep , info in dependency_version_paths_mapping . items ( )
3276- ]
3277-
3278- out = " \n " . join ( out )
3229+ out . extend (
3230+ [
3231+ string . format ( dep , * info )
3232+ for dep , info in dependency_version_paths_mapping . items ()
3233+ ]
3234+ )
32793235
32803236 if display :
3281- print (out ) # pragma: no cover
3237+ print (" \n " . join ( out ) ) # pragma: no cover
32823238 else :
32833239 return out
32843240
0 commit comments