1
1
import atexit
2
2
import csv
3
- import ctypes .util
4
- import importlib
5
3
import logging
6
4
import os
7
5
import platform
8
6
import re
9
- import sys
10
7
import warnings
11
8
from collections .abc import Iterable
12
9
from itertools import product
34
31
from .docstring import _docstring_substitution_definitions
35
32
36
33
37
- # Instruction to close /proc/mem at exit.
34
+ # Instruction to close /proc/meminfo at exit.
38
35
def _close_proc_meminfo ():
39
36
try :
40
37
_meminfo_file .close ()
@@ -3134,34 +3131,6 @@ def _section(x, axes=None, stop=None, chunks=False, min_step=1):
3134
3131
return out
3135
3132
3136
3133
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
-
3165
3134
def environment (display = True , paths = True ):
3166
3135
"""Return the names and versions of the cf package and its
3167
3136
dependencies.
@@ -3188,97 +3157,84 @@ def environment(display=True, paths=True):
3188
3157
3189
3158
>>> cf.environment()
3190
3159
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
3191
3166
HDF5 library: 1.14.2
3192
3167
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
3211
3183
3212
3184
>>> cf.environment(paths=False)
3213
3185
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
3214
3192
HDF5 library: 1.14.2
3215
3193
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
3220
3194
netCDF4: 1.7.2
3221
3195
h5netcdf: 1.3.0
3222
3196
h5py: 3.12.1
3197
+ zarr: 3.0.8
3223
3198
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
3229
3201
cftime: 1.6.4.post1
3230
3202
cfunits: 3.3.7
3231
- cfplot: 3.3.0
3232
3203
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
3233
3208
cf: NEXTVERSION
3234
3209
3235
3210
"""
3211
+ # Get cfdm env
3212
+ out = cfdm .environment (display = False , paths = paths )
3213
+
3214
+ _get_module_info = cfdm .functions ._get_module_info
3236
3215
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" ), "" ),
3243
3216
"esmpy/ESMF" : (
3244
3217
_get_module_info ("esmpy" , alternative_name = "ESMF" , try_except = True )
3245
3218
),
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" ),
3255
3219
"psutil" : _get_module_info ("psutil" ),
3256
- "packaging" : _get_module_info ("packaging" ),
3257
- "numpy" : _get_module_info ("numpy" ),
3258
- "scipy" : _get_module_info ("scipy" ),
3259
3220
"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" ),
3264
3221
"cfplot" : _get_module_info ("cfplot" , try_except = True ),
3265
- "cfdm" : _get_module_info ("cfdm" ),
3266
3222
"cf" : (__version__ , _os_path_abspath (__file__ )),
3267
3223
}
3268
3224
string = "{0}: {1!s}"
3269
3225
if paths :
3270
- # Include path information, else exclude, when unpacking tuple
3226
+ # Include path information, else exclude, when unpacking tuple.
3271
3227
string += " {2!s}"
3272
3228
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
+ )
3279
3235
3280
3236
if display :
3281
- print (out ) # pragma: no cover
3237
+ print (" \n " . join ( out ) ) # pragma: no cover
3282
3238
else :
3283
3239
return out
3284
3240
0 commit comments