在Bash运行Python脚本时,如何动态调用函数并赋值返回值?
解决方案:交互式选择函数生成并拼接HTML内容
听起来你需要的是一个能交互式选择生成HTML片段、还支持循环拼接结果的脚本对吧?我帮你梳理下问题核心和具体实现方案:
问题核心拆解
你之前把makeHTMLCBs()这类带括号的函数放进列表时,Python会立即执行它们——这是因为括号就是函数调用的语法。我们需要的是存储函数对象本身(不带括号),等到用户选择后再去调用执行。
完整实现代码
下面是适配你需求的脚本,能在Bash中正常运行,支持选择编号调用函数、循环拼接HTML内容:
import sys # 1. 先配置模块路径(替换成你实际的模块路径) pyPaths = ["/path/to/your/python/modules"] for path in pyPaths: sys.path.append(path) # 2. 导入需要的函数(注意:这里只导入函数对象,不要加括号!) from your_module_name import ( makeHTMLrbsNums, makeHTMLCBs, makeDropdownboxes, readLinesTextboxesInlineV3 ) # 3. 定义函数选项:(编号, 函数对象, 功能描述) function_menu = [ (1, makeHTMLrbsNums, "生成数字单选框HTML"), (2, makeHTMLCBs, "生成复选框HTML"), (3, makeDropdownboxes, "生成下拉框HTML"), (4, readLinesTextboxesInlineV3, "生成行内文本框HTML"), (0, None, "退出并导出最终网页") ] def main(): final_html = "" print("=== 每周作业网页生成工具 ===") while True: # 打印可选菜单 print("\n请选择要执行的功能:") for num, func, desc in function_menu: print(f"{num}. {desc}") # 处理用户输入 try: choice = int(input("请输入编号:")) # 匹配用户选择的选项 selected = next((opt for opt in function_menu if opt[0] == choice), None) if not selected: print("⚠️ 无效编号,请重新输入!") continue num, target_func, desc = selected if num == 0: print("\n✅ 开始生成最终网页...") break # 调用选中的函数,拼接结果 print(f"🔧 正在执行「{desc}」...") html_segment = target_func() final_html += html_segment print("✅ 该部分HTML已成功添加!") except ValueError: print("⚠️ 请输入有效的数字编号!") # 将最终结果写入HTML文件 with open("weekly_assignment.html", "w", encoding="utf-8") as f: # 可以根据需求添加基础HTML结构 f.write(f""" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>每周作业网页</title> </head> <body> {final_html} </body> </html> """) print("🎉 网页已生成:weekly_assignment.html") if __name__ == "__main__": main()
关键细节说明
- 存储函数对象而非调用结果:
function_menu里的函数名不带括号,只有当用户选择后,才通过target_func()去执行,完美解决了“函数立即执行”的问题。 - 交互式循环逻辑:通过
while True实现循环选择,直到用户输入0退出,满足你“每周按需拼接不同模块”的需求。 - 异常处理:对非数字输入做了捕获,避免脚本直接崩溃。
- 输出完整HTML文件:最后自动把拼接好的内容套入基础HTML结构,直接生成可打开的网页文件。
使用注意事项
- 把
/path/to/your/python/modules替换成你实际存放自定义函数的目录路径 - 如果你的函数需要参数,可以在调用
target_func()前添加参数输入逻辑 - 可以根据需求修改
function_menu里的选项,添加/删除函数
内容的提问来源于stack exchange,提问作者Pedroski
相关产品推荐
相关产品推荐

