使用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
相关产品推荐
相关产品推荐

