@@ -28,10 +28,31 @@ def ensure_module(module_name, package_name=None):
2828 # Check again after installation
2929 if importlib .util .find_spec (module_name ) is None :
3030 raise ImportError (f"Installation failed: '{ module_name } ' not found after installation." )
31-
32- return True # Module is available
33- except subprocess .CalledProcessError :
34- print (f"Error: Failed to install '{ module_name } '. Please install it manually." )
31+
32+ # Check if installed version matches required version from package_name
33+ if package_name and '==' in package_name :
34+ required_version = package_name .split ('==' )[1 ]
35+ module = importlib .import_module (module_name )
36+ installed_version = getattr (module , '__version__' , None )
37+
38+ if installed_version != required_version :
39+ print (f"Module '{ module_name } ' version { installed_version } found, but { required_version } required. Reinstalling..." )
40+ # Uninstall current version
41+ subprocess .check_call ([sys .executable , "-m" , "pip" , "uninstall" , "-y" , module_name ])
42+ # Install required version
43+ subprocess .check_call ([sys .executable , "-m" , "pip" , "install" , package_name ])
44+
45+ # Clear cached modules
46+ for mod_name in list (sys .modules .keys ()):
47+ if mod_name == module_name or mod_name .startswith (f"{ module_name } ." ):
48+ del sys .modules [mod_name ]
49+
50+ print (f"Module '{ module_name } ' reinstalled successfully with version { required_version } ." )
51+
52+ return True
53+
54+ except subprocess .CalledProcessError as e :
55+ print (f"Error: { e } Failed to install '{ module_name } '. Please install it manually." )
3556 except ImportError as e :
3657 print (f"Error: { e } " )
3758 except Exception as e :
@@ -147,7 +168,6 @@ def download_zenodo_record(api_url, download_dir="zenodo_files", extract_tar=Tru
147168 print ("If you want to re-download, please delete the directory." )
148169
149170
150-
151171def timer (description = None ):
152172 """
153173 Decorator that measures and prints execution time of a function.
0 commit comments