使用python子进程调用处理通配符扩展

时间:2018-04-26 16:36:32

标签: python subprocess glob

我正在调用此功能并使用%s*silent 读取具有以下格式名称的文件:name.number.silent.

我从start_model.split('/')[-1].split('.')[0]获取名称,所以不要担心。

这显然是正在工作,因为这些命令实际上从未传递给shell。如果我要使用glob,我如何修改我的代码以执行我在下面做的事情?

from subprocess import call

def fragment_score(rosetta_path, silent_input_and_score_output, start_model):
    call([rosetta_path,
          '-mode score', 
          '-in::file::silent', '%s/%s*silent' % (silent_input_and_score_output, start_model.split('/')[-1].split('.')[0]),
          '-scorefile', '%s/scores1' % silent_input_and_score_output,
          '-n_matches', '50'])

1 个答案:

答案 0 :(得分:1)

使用the Python glob module生成一个glob结果列表,并将它拼接到你的参数列表中的相同位置,否则你将使用相关匹配列表替换一个glob表达式:

from subprocess import call
from glob import glob

def fragment_score(rosetta_path, silent_input_and_score_output, start_model):
    glob_exp = '%s/%s*silent' % (silent_input_and_score_output, start_model.split('/')[-1].split('.')[0])
    glob_results = glob(glob_exp)
    call([rosetta_path,
          '-mode score', 
          '-in::file::silent'
         ] + glob_results + [
          '-scorefile', '%s/scores1' % silent_input_and_score_output,
          '-n_matches', '50'])

在当前的Python 3.x中,有一种语法可以让它更自然:

    call([rosetta_path,
          '-mode score', 
          '-in::file::silent',
          *glob_results,
          '-scorefile', '%s/scores1' % silent_input_and_score_output,
          '-n_matches', '50'])