importlib.reload() 未重新加载

importlib.reload() not realoading

我正在尝试创建一个类似在线裁判的 leetcode。我需要重新加载提交模块,但 import.reload() 不起作用。

代码:

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')

我的目录;

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

exercise/solution.py:

def main(): 
    print('EXERCISE')

练习/init.py

from .solution import main
from .test import cases

other_exercise/solution.py:

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

输出:

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

我选择了另一种选择;将 solution.py 作为文本加载并从该字符串创建一个模块。该模块未在 sys.modules 中注册,可以被覆盖。但是 imp 已弃用。

import imp

class Test:
    current_exercise = None

    def _import(self, exercise):

        # load module code 
        with open(f'./puzzles/{exercise}/solution.py') as f:
            code = f.read()

            # register/create the module
            self.current_exercise = imp.new_module('mymodule')

            # import/fill the module 
            exec(code, self.current_exercise.__dict__)

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

这个有效:

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')