Search code examples
pythonpython-3.xpython-importlib

importlib.reload() not realoading


I am trying to create a leetcode like online judge. I need to reload the submission module but import.reload() does not work.

The code:

class Test:
    current_exercise = None
    current_name = None

    def _import(self, exercise):
        exercise = 'exercise'    # for testing 

        if exercise == self.current_name:
            module = sys.modules[f'puzzles.{exercise}']
            self.current_exercise = importlib.reload(module)    # <---- not working 
        else:
            self.current_name = exercise
            self.current_exercise = __import__(f'puzzles.{exercise}').exercise

    def _test(self, exercise):
        solution = self._import(exercise)
        print(self.current_exercise.main())

if __name__=='__main__':
    import shutil
    t= Test()

    # first run 
    t._test('exercise')
    
    # copy another solution.py for reload test
    shutil.copy(f"./puzzles/other_exercise/solution.py", f"./puzzles/exercise/solution.py")

    # second run 
    t._test('exercise')

My directory;

.
├── codetest.py
├── puzzles
│   ├── __init__.py
│   ├── exercise
│   │   ├── __init__.py
│   │   ├── solution.py
│   ├── other_exercise
│   │   ├── __init__.py
│   │   ├── solution.py

exercise/solution.py:

def main(): 
    print('EXERCISE')

exercise/init.py

from .solution import main
from .test import cases

other_exercise/solution.py:

def main(): 
    print('OTHER EXERCISE')

Output:

> EXERCISE
> EXERCISE   # <--- not sucessfull, should be 'OTHER EXERCISE'

Solution

  • This works:

    import sys
    import time
    import importlib
    
    class Test:
        current_exercise = None
        current_name = None
    
        def _import(self, exercise):
    
            if exercise == self.current_name:
                self.current_exercise.solution = importlib.reload(self.current_exercise.solution)
            else:
                self.current_name = exercise
                self.current_exercise = importlib.import_module(f'puzzles.{exercise}')
            print('mod',self.current_exercise)
            print('nam',self.current_exercise.__name__)
            print('fil',self.current_exercise.__file__)
            print('pkg',self.current_exercise.__package__)
    
        def _test(self, exercise):
            solution = self._import(exercise)
            print(self.current_exercise.solution.main())
    
    if __name__=='__main__':
        import shutil
        shutil.copy(f"./puzzles/exercise/solution.0", f"./puzzles/exercise/solution.py")
        t= Test()
    
        # first run 
        t._test('exercise')
        
        # copy another solution.py for reload test
        shutil.copy("./puzzles/other_exercise/solution.py", "./puzzles/exercise/solution.py")
        print(open("./puzzles/exercise/solution.py").read())
    
        # second run 
        t._test('exercise')