在curses屏幕内重新加载脚本

时间:2019-08-11 18:10:11

标签: python-3.x windows-10

我一直在互联网上寻找答案,我发现许多事情声称他们应该做到这一点,但最终似乎与我的程序无关。

此开发正在针对运行Python 3.6的Windows 10操作系统完成

这是我程序的一般流程:

from curses import wrapper
from core.login import Login
from core.screen import Screen
def main(stdscr):
    try:
        screen = Screen(stdscr)
        Login(screen)
    except Exception:
        screen.terminate(traceback.format_exc())

if __name__ == '__main__':
    wrapper(main)

我们首先在Screen()类中构建一个curses窗口,然后将该窗口传递到每个后续脚本中,例如Login()或Login()之后将调用的任何脚本。这允许单个Screen()对象在所有“屏幕控制器”之间共享。每个“控制器”都有自己的逻辑,可以识别他们想要在屏幕上显示哪些数据,然后将这些数据传递给Screen()对象进行相应的处理和呈现。

注意:“控制器”通过构建显示输出,等待用户输入然后重新构建显示输出,不断运行循环,将数据不断发送到Screen()类。

当我需要在curses窗口中开始测试输出时,开发过程有点慢,因为我需要终止主脚本并从头开始不断重新加载它。我的希望是找到一种方法来简单地重新加载所有相关模块(包括调用reload的脚本Screen()),这样我就完全不需要关闭curses应用程序,并且可以实时看到更改。

这是我目前尝试从Screen()类中重新加载现有模块的方法:

    def reload_modules(self):
        import sys, os, importlib

        modules = sys.modules
        current_dir = os.path.dirname(os.path.realpath(__file__))
        # This has every file the program would run inside it
        source_dir = current_dir[:current_dir.find("source") + len("source")]

        for path, subdirs, files in os.walk(source_dir):
            # avoiding __pycache__
            if path.find('__') == -1:
                package = path.split(source_dir)[1].replace('\\', '.').lstrip('.')
                for name in files:
                    # avoiding __init__.py
                    if name.find('__') == -1:
                        if package:
                            try:
                                module = modules['.'.join([package, name.rstrip('.py')])]
                                importlib.reload(module)
                            except Exception:
                                pass

我在这里的思考过程应该是,我现在应该能够编辑Login()或其他任何“屏幕控制器”类,然后从Screen()类中执行此功能,并查看显示的新更改。我已经确认该过程可以在sys.modules中找到合适的模块,但是当调用importlib.reload(module)时-没有任何变化。

任何帮助将不胜感激!

0 个答案:

没有答案
相关问题