Python:编写命令行指令时的字符串格式化

Python:编写命令行指令时的字符串格式化

问题描述:

我有一个任务,我必须每次运行一系列参数略有不同的仿真。我想编写一个Python脚本来自动执行此操作,但我遇到了一个问题。Python:编写命令行指令时的字符串格式化

为了简化描述,我基本上有从命令行调用的N模拟,每个模拟都有一组不同的参数,我希望脚本一个接一个地执行它们。想象一下,要运行模拟,我会将execute_simulation...写入命令行,其中...代表给定模拟的参数。这是我的脚本看起来像:

from subprocess import call 

<code> 

for i in range(0, N): 
    call('execute_simulation_%s' % (parameters[i])) 

但是,我总是在调用脚本时收到错误消息。任何人都可以提出为什么这可能是这种情况?

+2

什么是错误信息? ['call'](https://docs.python.org/2.7/library/subprocess.html#subprocess.call)需要一个参数列表,而不是一个字符串(除非你使用'shell = True',你应该避免)。 – 2017-11-11 18:11:23

+1

什么错误消息? –

+0

准确的模拟文件是什么?你的'parameters []'是否也包含文件扩展名? 'call('ca%s.exe'%'lc')'正在为我工​​作(Win7)。 – bastelflp

如果您包含错误消息,但我会尽力帮助您。

call功能将字符串的顺序不是一个字符串(虽然Popen文档指出它们转换为Windows上的字符串,因此它可能在特定的情况下工作)。

此外,在您给出的示例代码中,您做了call('execute_simulation_%s' % (parameters[i]))。如果parameters[i]不是字符串,而是列表,元组,生成器或str将在该对象上调用,这意味着您得到类似execute_simulation ['arg0', 'arg1', 'arg2', 'arg3', 'arg4']的东西。这可能不是你想要的。您可以在序列上拨打' '.join以获得类似execute_simulation arg0 arg1 arg2 arg3 arg4的内容。

这样说的话,我认为parameters列表包含每个调用的参数列表。然后,你可以只是做

args = [f'arg{i}' for i in range(5)] 
parameters = [args for i in range(5)] 

for args in parameters: 
    call(('execute_simulation', *args)) 

而且,考虑使用subprocess.run,因为它建议在Python使用3.5+代码(它的工作原理就像call)。 我希望这适用于你的情况。