petsc/petsc-3.18.5-fix_python312_compatibility.patch

158 lines
5.8 KiB
Diff
Raw Normal View History

2023-06-21 19:25:32 +00:00
From f2ed88371e6f236237267476ee72a064ae0cd70f Mon Sep 17 00:00:00 2001
From: "Jose E. Roman" <jroman@dsic.upv.es>
Date: Tue, 20 Jun 2023 17:31:19 +0200
Subject: [PATCH] Fix for python-3.12: 'imp' module has been removed
Fixes #1401
---
config/BuildSystem/script.py | 11 +++---
lib/petsc/bin/petsc_tas_analysis.py | 1 -
.../petsc4py/src/petsc4py/lib/__init__.py | 38 ++++++++++++++-----
3 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/config/BuildSystem/script.py b/config/BuildSystem/script.py
index 5dbf2934fff..f120d335712 100644
--- a/config/BuildSystem/script.py
+++ b/config/BuildSystem/script.py
@@ -132,13 +132,12 @@ class Script(logger.Logger):
@staticmethod
def getModule(root, name):
'''Retrieve a specific module from the directory root, bypassing the usual paths'''
- import imp
+ import importlib.util
- (fp, pathname, description) = imp.find_module(name, [root])
- try:
- return imp.load_module(name, fp, pathname, description)
- finally:
- if fp: fp.close()
+ spec = importlib.util.spec_from_file_location(name, root)
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[name] = module
+ spec.loader.exec_module(module)
@staticmethod
def importModule(moduleName):
diff --git a/lib/petsc/bin/petsc_tas_analysis.py b/lib/petsc/bin/petsc_tas_analysis.py
index 7a74fd06d31..bb1c3e62b55 100755
--- a/lib/petsc/bin/petsc_tas_analysis.py
+++ b/lib/petsc/bin/petsc_tas_analysis.py
@@ -4,7 +4,6 @@ import os
import sys
import importlib
import datetime as date
-import importlib
# Check to ensure that the environmental variable PETSC_DIR has been assigned.
# MPLCONFIGDIR is needed for matplotlib
diff --git a/src/lib/__init__.py b/src/lib/__init__.py
2023-06-21 19:25:32 +00:00
index 85e9daf118e..310334eae21 100644
--- a/src/lib/__init__.py
+++ b/src/lib/__init__.py
2023-06-21 19:25:32 +00:00
@@ -13,7 +13,7 @@
This package is a holds all the available variants of the PETSc
extension module built against specific PETSc configurations. It also
-provides a convenience function using of the builtin ``imp`` module
+provides a convenience function using of the ``importlib`` module
for easily importing any of the available extension modules depending
on the value of a user-provided configuration name, the ``PETSC_ARCH``
environmental variable, or a configuration file.
@@ -45,19 +45,35 @@
Import helper for PETSc-based extension modules.
"""
import sys, os, warnings
- # TODO: use 'importlib' module under Python 3
- with warnings.catch_warnings():
- warnings.filterwarnings("ignore")
+ try:
+ import importlib.machinery
+ import importlib.util
+ except ImportError:
+ importlib = None
import imp
def get_ext_suffix():
- return imp.get_suffixes()[0][0]
+ if importlib:
+ return importlib.machinery.EXTENSION_SUFFIXES[0]
+ else:
+ return imp.get_suffixes()[0][0]
+
def import_module(pkg, name, path, arch):
- fullname = '%s.%s' % (pkg, name)
+ fullname = '{}.{}'.format(pkg, name)
pathlist = [os.path.join(path, arch)]
- f, fn, info = imp.find_module(name, pathlist)
- with f: return imp.load_module(fullname, f, fn, info)
+ if importlib:
+ finder = importlib.machinery.PathFinder()
+ spec = finder.find_spec(fullname, pathlist)
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[fullname] = module
+ spec.loader.exec_module(module)
+ return module
+ else:
+ f, fn, info = imp.find_module(name, pathlist)
+ with f:
+ return imp.load_module(fullname, f, fn, info)
+
# test if extension module was already imported
- module = sys.modules.get('%s.%s' % (pkg, name))
+ module = sys.modules.get('{}.{}'.format(pkg, name))
filename = getattr(module, '__file__', '')
if filename.endswith(get_ext_suffix()):
# if 'arch' is None, do nothing; otherwise this
@@ -66,6 +82,7 @@
if arch is not None and arch != module.__arch__:
raise ImportError("%s already imported" % module)
return module
+
# silence annoying Cython warning
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ndarray size changed")
From c36e9c688a542448939d85251c93951e001443de Mon Sep 17 00:00:00 2001
From: "Jose E. Roman" <jroman@dsic.upv.es>
Date: Thu, 22 Jun 2023 10:28:53 +0200
Subject: [PATCH 2/2] script.py: improve portability for python < 3.5
---
config/BuildSystem/script.py | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/config/BuildSystem/script.py b/config/BuildSystem/script.py
index f120d335712..d3305288195 100644
--- a/config/BuildSystem/script.py
+++ b/config/BuildSystem/script.py
@@ -132,12 +132,23 @@ class Script(logger.Logger):
@staticmethod
def getModule(root, name):
'''Retrieve a specific module from the directory root, bypassing the usual paths'''
- import importlib.util
-
- spec = importlib.util.spec_from_file_location(name, root)
- module = importlib.util.module_from_spec(spec)
- sys.modules[name] = module
- spec.loader.exec_module(module)
+ try:
+ import importlib.util
+ except ImportError:
+ importlib = None
+ import imp
+
+ if importlib and sys.version_info > (3,4):
+ spec = importlib.util.spec_from_file_location(name, root)
+ module = importlib.util.module_from_spec(spec) # novermin
+ sys.modules[name] = module
+ spec.loader.exec_module(module)
+ else:
+ (fp, pathname, description) = imp.find_module(name, [root])
+ try:
+ return imp.load_module(name, fp, pathname, description)
+ finally:
+ if fp: fp.close()
@staticmethod
def importModule(moduleName):
--
GitLab