如何通过Bash递归查找setup.py并验证entry_points含main开头的console脚本
递归查找setup.py并检查console_scripts是否包含main开头的脚本
方案一:Python脚本(推荐,准确处理所有格式)
要可靠处理Python代码的单行/多行格式,用ast模块解析代码结构是最优解,避免字符串匹配的局限性。
以下是完整脚本:
import os import ast def check_main_script_in_setup(root_dir): # 递归遍历目录下所有setup.py for dirpath, _, filenames in os.walk(root_dir): for filename in filenames: if filename == "setup.py": setup_path = os.path.join(dirpath, filename) with open(setup_path, "r", encoding="utf-8") as f: try: tree = ast.parse(f.read()) except SyntaxError as e: print(f"解析{setup_path}出错: {e}") continue # 定位setup函数调用节点 for node in ast.walk(tree): if isinstance(node, ast.Call) and hasattr(node.func, "id") and node.func.id == "setup": entry_points = None # 提取entry_points关键字参数 for kwarg in node.keywords: if kwarg.arg == "entry_points": try: entry_points = ast.literal_eval(kwarg.value) except (ValueError, SyntaxError): print(f"{setup_path}中的entry_points无法解析") break break if not entry_points: print(f"{setup_path}中未找到entry_points") continue # 检查console_scripts console_scripts = entry_points.get("console_scripts", []) for script in console_scripts: if isinstance(script, str) and script.startswith("main="): return True return False # 使用示例:检查当前目录及子目录 result = check_main_script_in_setup("./") print(result)
脚本说明:
- 递归扫描目标目录下所有
setup.py文件 - 通过AST语法解析定位
setup()函数调用,提取entry_points参数 - 检查
console_scripts列表中是否存在以main=开头的脚本项 - 找到匹配项立即返回
True,遍历完所有文件未找到则返回False,解析出错时打印提示信息
方案二:Shell命令组合(快速临时处理)
如果偏好命令行工具,可通过grep组合实现,但该方式依赖代码格式固定,若格式变动可能失效。
命令示例:
# 递归查找setup.py,提取entry_points相关内容并检查console_scripts grep -r "entry_points" ./ --include="setup.py" -A 10 | grep -qE '"console_scripts":.*main=' && echo "True" || echo "False"
说明:
grep -r "entry_points" ./ --include="setup.py" -A 10:递归查找含entry_points的行,并显示后续10行(覆盖多行写法)grep -qE '"console_scripts":.*main=':静默匹配console_scripts行中包含main=的内容- 通过
&&/||输出最终的True/False结果
局限性:
- 若entry_points的console_scripts块超过10行,需调整
-A后的数字 - 代码中注释或字符串包含类似内容时,可能出现误匹配
- 无法处理复杂嵌套的代码格式
内容的提问来源于stack exchange,提问作者Data Mastery
相关产品推荐
相关产品推荐

