带有动态变量和参数的Python子进程



当参数是动态的时,我想问如何在python中运行subprocess.run()或subprocess.call()。我已经将所有命令存储在外部批处理文件中,并且我想在更新参数后使用Python运行批处理文件。我将在下面给出更多的细节:

批处理文件是这样的:

echo on
set yyyy=%1
set mm=%2
set dd=%3
set rangePath=%4
set pulPath=%5
set stasDate=%6
'''Command to run the batch file'''

我现在的代码是:

param_temp = 'pathway for parameter input yaml file'+'param_input.yml'
param = yaml.safe_load(param_temp)
yyyy = str(param['Year'])
mm = str(param['Month'])
dd = str(param['Date'])
rangePath = param['Path1']
pulPath = param['Path2']
stasDate = str(param['yyyymmdd'])
param_str = (yyyy+'_'+mm+'_'+dd+'_'+rangePath+'_'+pulPath+'_'+stasDate).split('_')
subprocess.call(param_str + [str('batch file path')], shell=False)

我创建了一个YAML文件来包含我的所有参数,并且打算仅在我想为不同的日期运行批处理文件时才调整我的YAML文件。我选择param_str是因为我在谷歌上搜索了它,web告诉我,%1表示输入批处理文件名后的变量或匹配字符串。然而,该方法要么无效,要么不输出任何内容。请问谁能给我一些建议,告诉我该怎么做?

一个稍微简单一点的实现可能是:

#!/usr/bin/env python
import yaml
param_temp = 'pathway for parameter input yaml file'+'param_input.yml'
batch_path = 'batch file path'
param = yaml.safe_load(param_temp)
params = [ 'Year', 'Month', 'Date', 'Path1', 'Path2', 'yyyymmdd' ]
param_values = [ str(param[p]) for p in params ]
subprocess.call([batch_path] + param_values)

注意:

  • 要调用的脚本的路径在之前
  • 我们不会生成一个下划线分隔的字符串,只是为了将它分割成一个列表——直接生成一个列表更明智(也更不容易出错)。
  • shell=False是默认的,所以不需要显式指定。

最新更新