首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >importlib.reload()不变现

importlib.reload()不变现
EN

Stack Overflow用户
提问于 2021-05-13 23:52:18
回答 2查看 153关注 0票数 1

我正在尝试创建一个类似在线法官的代码。我需要重新加载提交模块,但是import.reload()不能工作。

守则:

代码语言:javascript
复制
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')

我的目录;

代码语言:javascript
复制
.
├── codetest.py
├── puzzles
│   ├── __init__.py
│   ├── exercise
│   │   ├── __init__.py
│   │   ├── solution.py
│   ├── other_exercise
│   │   ├── __init__.py
│   │   ├── solution.py

锻炼/解决办法.:

代码语言:javascript
复制
def main(): 
    print('EXERCISE')

exercise/init.py

代码语言:javascript
复制
from .solution import main
from .test import cases

其他锻炼/解决办法。

代码语言:javascript
复制
def main(): 
    print('OTHER EXERCISE')

输出:

代码语言:javascript
复制
> EXERCISE
> EXERCISE   # <--- not sucessfull, should be 'OTHER EXERCISE'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-14 03:08:05

这样做是可行的:

代码语言:javascript
复制
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')
票数 2
EN

Stack Overflow用户

发布于 2021-05-14 03:04:36

我选择了另一种方法:将solution.py作为文本加载,并从该字符串创建一个模块。该模块没有在sys.modules中注册,可以被覆盖。然而,imp是不可取的。

代码语言:javascript
复制
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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67527519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档