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

使用Python subprocess调用时通配符展开问题及glob改造咨询

改用glob解决通配符匹配问题的方案

咱们先弄明白为啥原来的写法行不通:当你用subprocess.call()的列表参数模式时(也就是不设置shell=True),系统不会帮你解析*这种通配符——它会把%s*silent当成一个完整的文件名去查找,自然找不到对应的文件。用glob模块就能主动帮我们找出所有符合name.number.silent格式的文件,完美解决这个问题。

下面是修改后的完整代码,我会把关键改动标出来:

from subprocess import call
import glob  # 第一步:导入glob模块

def fragment_score(rosetta_path, silent_input_and_score_output, start_model):
    # 提取name,这部分按你给定的逻辑来
    name = start_model.split('/')[-1].split('.')[0]
    # 第二步:用glob构造匹配模式,找出所有符合name.number.silent格式的文件
    # 这里的*会匹配任意字符(包括数字),刚好符合你的文件名格式
    silent_files = glob.glob(f"{name}.*.silent")
    
    # 可选但建议:加个判断,避免没有匹配到文件时调用Rosetta出错
    if not silent_files:
        raise ValueError(f"No files matching pattern {name}.*.silent found!")
    
    # 第三步:把匹配到的所有silent文件作为参数传入call
    # 这里假设原来的命令参数里,需要把silent文件放在某个位置,替换掉原来的%s*silent部分
    call([
        rosetta_path,
        # 其他必要的命令参数...
        *silent_files,  # 用解包操作把所有匹配到的文件作为单独参数传入
        silent_input_and_score_output
        # 其他后续参数...
    ])

关键改动说明:

  • 导入glob模块:这是实现文件匹配的核心依赖,专门用来处理文件系统的通配符匹配。
  • 构造匹配模式:f"{name}.*.silent"会精准匹配所有以name.开头、.silent结尾的文件,完全符合你需要的name.number.silent格式。
  • 解包文件列表:用*silent_files把匹配到的文件列表解包成单独的命令行参数,这和你在shell里输入多个文件名的效果一致,Rosetta就能正确识别这些输入文件了。
  • 空列表判断:如果没有匹配到任何文件,直接抛出异常,避免后续调用Rosetta时出现莫名其妙的错误,方便排查问题。

内容的提问来源于stack exchange,提问作者ahmadkhalifa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:29