跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Cerulean)
  • 不使用皮肤
折叠
品牌标识

PyMUD官方论坛

  1. 主页
  2. 版块
  3. PyMUD讨论区
  4. 如何加载不同模块(.py)?

如何加载不同模块(.py)?

已定时 已固定 已锁定 已移动 PyMUD讨论区
12 帖子 3 发布者 69 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • T 离线
    T 离线
    terry
    编写于 最后由 编辑
    #1

    请教个问题,如何通过一个主.py文件来加载不同的模块,文件结构大概如下:

    ├── mud_main.py # 主入口
    ├── pymud.cfg # 配置文件,设置default_script": [" mud_main"]
    ├── triggers/
    │ └── common_triggers.py # 通用trigger
    ├──commands/
    │ └── fight.py

    如何写mud_main.py代码来加载其他文件夹下的模块?

    N 1 条回复 最后回复
    0
    • T terry

      请教个问题,如何通过一个主.py文件来加载不同的模块,文件结构大概如下:

      ├── mud_main.py # 主入口
      ├── pymud.cfg # 配置文件,设置default_script": [" mud_main"]
      ├── triggers/
      │ └── common_triggers.py # 通用trigger
      ├──commands/
      │ └── fight.py

      如何写mud_main.py代码来加载其他文件夹下的模块?

      N 离线
      N 离线
      newstart
      编写于 最后由 newstart 编辑
      #2

      步骤一:先把目录结构改成这样的

      > 
      > |-----mud_main.py              # 主入口
      > |-----pymud.cfg                # 配置文件,设置default_script": [" mud_main"]
      > |-----xkx/                     # 此处增加一个目录,作为package管理所有的下级模块
      >       |----- __init__.py       # 此处增加一个空文件,文件名必须为 __init__.py 用来指示 xkx 这个目录是一个 package。下级每一个子目录都要增加一个 __init__.py 的空文件
      >       |----- main.py           # 建议增加一个包内的最终管理文件,通用的配置都放在这里,mud_main.py仅保留入口检查功能
      >       |----- triggers/
      >             |----- __init__.py                   # 空文件,指示为package
      >             |----- common_triggers.py            # 通用trigger
      >       |----- commands/
      >             |----- __init__.py                   # 空文件,指示为package
      >             |----- fight.py                      # fight 模块
      
      

      步骤二: mud_main.py 的内容写成这样的

      import os
      from pymud import IConfig, Session
      
      class EntryConfig(IConfig):
          def __init__(self, session: Session, *args, **kwargs):
              reload = kwargs.get("reload", False)    # 处理参数里的 reload, 用于支持 #reload mud_main 就可以重新加载所有脚本
              self.session = session
              
              # 脚本加载顺序
              mods = list()
              current_dir = os.path.dirname(__file__)        # 获取当前文件所在的目录
              root_dir = os.path.join(current_dir, "xkx")    # 当前目录下的xkx目录
      
              dir = os.path.join(root_dir, "triggers")           # 处理triggers子目录下的所有文件
              if os.path.exits(dir):
                  for file in os.listdir(dir):
                      if file.endswith(".py") and (not file.startswith("__")):     #获取目录下的所有.py文件,并排除 __init__.py
                          mods.append(f"xkx.triggers.{file[:-3]}")
      
              dir = os.path.join(root_dir, "commands")     # 处理 commands目录下的所有文件,原理同上
              if os.path.exists(dir):
                  for file in os.listdir(dir):
                      if file.endswith(".py") and (not file.startswith("__")):     #获取目录下的所有.py文件,并排除 __init__.py
                          mods.append(f"xkx.commands.{file[:-3]}")
      
              mods.append("xkx.main")                           # 通用的main文件可能会调用其他模块内容,放在最后
      
              session.load_module(mods)
      
              if reload:                     # 处理 reload
                  session.reload_module(mods)
      
              self.mods = mods     # 保存mods供unload使用
      
          def __unload__(self):
              # 卸载时按照加载的反向顺序逐个卸载
              for mod in reversed(self.mods):
                  self.session.unload_module(mod)
      
      

      后续要往子目录里增加文件,直接加 xxx.py 就可以了,在子目录下的文件会被自动获取并加载。

      1 条回复 最后回复
      0
      • T 离线
        T 离线
        terry
        编写于 最后由 编辑
        #3

        太好了,今天就实践这些代码

        1 条回复 最后回复
        0
        • T 离线
          T 离线
          terry
          编写于 最后由 编辑
          #4

          可否这样优化结构?
          根目录下只放pymud.cfg。子目录放不同的mud游戏的文件夹,比如xkx和thu_xyj,然后其对应目录中放一个入口的py文件,比如xkx_entry.py。
          但我不明白main.py还可以放什么代码

          |-----pymud.cfg # 配置文件,不同的游戏设置对应的default_script
          |-----xkx # 存放所有xkx所有相关的脚本
                  |----- __init__.py # 指示 xkx 这个目录是一个 package。
                  |----- xkx_entry.py # xkx脚本入口
                  |----- main.py # 不知道需要放哪些通用的配置?
                  |----- triggers/
                          |----- __init__.py # 空文件,指示为package
                          |----- common_triggers.py # 通用trigger
                  |----- commands/
                          |----- __init__.py # 空文件,指示为package
                          |----- fight.py # fight 模块
          |-----thu_xyj # 存放所有xkx所有相关的脚本, 与xkx类似
                  |----- __init__.py # 指示这个目录是一个 package。
                  |----- thu_entry.py # thu_xyj脚本入口, 其他文件略
          |-----utils # 存放通用的方法,比如中文数字转换为阿拉伯数字的方法
                  |----- __init__.py # 指示 这个目录是一个 package。
                  |----- utils.py # thu_xyj脚本入口, 其他文件略

          1 条回复 最后回复
          0
          • N 离线
            N 离线
            newstart
            编写于 最后由 编辑
            #5

            你可以试试看,我不太确定行不行,main.py不知道放什么的话,不用也没关系

            1 条回复 最后回复
            0
            • T 离线
              T 离线
              terry
              编写于 最后由 编辑
              #6

              初步试验了下,是可以的

              1 条回复 最后回复
              0
              • T 离线
                T 离线
                terry
                编写于 最后由 terry 编辑
                #7

                最终的xkx_entry.py文件

                import sys
                import os
                from pymud import IConfig, Session
                
                class EntryConfig(IConfig):
                    def __init__(self, session: Session, *args, **kwargs):
                        reload = kwargs.get("reload", False)    # 处理参数里的reload, 用于支持 #reload
                        self.session = session
                
                        modules = list()
                        root_dir = os.path.dirname(__file__)        # 获取当前文件所在的目录    
                        root_folder_name = os.path.basename(root_dir) # 获取当前文件所在的目录名
                
                        if os.path.exists(root_dir):                   
                            for item in os.listdir(root_dir):   #优先加载根目录.py文件,并排除 __init__.py
                                if (not os.path.isdir(os.path.join(root_dir,item))) and item.endswith(".py") and (not item.startswith("__")) and (not item.endswith("entry.py")):
                                    modules.append(f"{root_folder_name}.{item[:-3]}")
                            for item in os.listdir(root_dir):     #二次循环,加载子文件夹下的.py文件,并排除 __init__.py
                                if os.path.isdir(os.path.join(root_dir,item)) and (not item.startswith("__")):
                                    for file in os.listdir(os.path.join(root_dir,item)):   
                                        if (not os.path.isdir(os.path.join(root_dir,item,file))) and file.endswith(".py") and (not file.startswith("__")):
                                            modules.append(f"{root_folder_name}.{item}.{file[:-3]}")
                
                        session.load_module(modules)
                        if reload:                     # 处理 reload
                            session.reload_module(modules)
                        self.modules = modules     # 保存mods供unload使用
                    def __unload__(self):
                        # 卸载时按照加载的反向顺序逐个卸载
                        for mod in reversed(self.modules):
                            self.session.unload_module(mod)
                
                1 条回复 最后回复
                0
                • N 离线
                  N 离线
                  newstart
                  编写于 最后由 编辑
                  #8

                  很好,就是需要有探索精神😂🤣

                  T 1 条回复 最后回复
                  0
                  • N newstart

                    很好,就是需要有探索精神😂🤣

                    T 离线
                    T 离线
                    terry
                    编写于 最后由 编辑
                    #9

                    @newstart 还得群主指导啊,我照猫画虎,优化了点儿

                    1 条回复 最后回复
                    0
                    • S 离线
                      S 离线
                      shanghua
                      编写于 最后由 shanghua 编辑
                      #10

                      https://www.pkuxkx.net/forum/thread-50002-1-1.html

                      跟这帖子不一样吗?

                      N 1 条回复 最后回复
                      0
                      • S shanghua

                        https://www.pkuxkx.net/forum/thread-50002-1-1.html

                        跟这帖子不一样吗?

                        N 离线
                        N 离线
                        newstart
                        编写于 最后由 编辑
                        #11

                        @shanghua 在 如何加载不同模块(.py)? 中说:

                        https://www.pkuxkx.net/forum/thread-50002-1-1.html

                        跟这帖子不一样吗?

                        一样的,就是这个🤣

                        1 条回复 最后回复
                        0
                        • T 离线
                          T 离线
                          terry
                          编写于 最后由 terry 编辑
                          #12

                          哦,我不上xkx的论坛的~~~
                          不过这个帖子好像之前搜索pyMud的时候看过,
                          但现在又忘记了
                          这记性真不行了

                          1 条回复 最后回复
                          0
                          回复
                          • 在新帖中回复
                          登录后回复
                          • 从旧到新
                          • 从新到旧
                          • 最多赞同


                          • 登录

                          • 没有帐号? 注册

                          • 登录或注册以进行搜索。
                          Powered by NodeBB Contributors
                          • 第一个帖子
                            最后一个帖子
                          0
                          • 版块
                          • 最新
                          • 标签
                          • 热门
                          • 世界
                          • 用户
                          • 群组