如何从独立Python脚本中获取docstring用于GUI展示
现存代码存在的问题
- 打开脚本时未指定编码,跨平台或非默认编码的Python脚本读取时会触发解码错误
- 采用
''.join(open(script_path))的写法未自动释放文件资源,长时间运行会出现IO句柄泄漏 - 脚本未编写顶层docstring时,
ast.get_docstring()会返回None,直接传入setPlainText会触发类型错误 - 无异常捕获逻辑:用户选中非Python文件、文件无读取权限、脚本存在语法错误时,AST解析会直接导致GUI程序崩溃
修正后的可用代码
# index is test.py def on_selected(self, index): script_path = self.tree_view_model.filePath(index) # 仅处理Python后缀文件,过滤无效选中项 if not script_path.endswith('.py'): self.textBrowser_description.setPlainText('') return try: # 用上下文管理器安全读取文件,统一指定UTF-8编码避免乱码 with open(script_path, 'r', encoding='utf-8') as f: source = f.read() # 解析源码得到模块AST节点 module_node = ast.parse(source) # 获取docstring,为空时返回默认提示文本 doc_content = ast.get_docstring(module_node) or "当前选中脚本未编写说明文档" self.textBrowser_description.setPlainText(doc_content) except (IOError, SyntaxError, PermissionError): # 覆盖文件读取失败、脚本语法错误、无访问权限等异常场景 self.textBrowser_description.setPlainText("该脚本的说明内容加载失败")
补充说明
- 上述逻辑仅提取脚本顶层的模块docstring,符合常规脚本说明的编写规范
- 若自定义文件视图返回的是相对路径,可先通过
os.path.abspath(script_path)转成绝对路径,避免读取不到对应文件 - 若需要提取类、函数级别的docstring,可额外遍历AST节点的子节点做匹配提取
- 可增加文件大小校验逻辑,避免加载超大文件造成UI卡顿
内容的提问来源于stack exchange,提问作者e4862
相关产品推荐
相关产品推荐

