You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:01:09