跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • 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 发布者 70 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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
                        • 版块
                        • 最新
                        • 标签
                        • 热门
                        • 世界
                        • 用户
                        • 群组