【问题标题】:Python: String formatting when when writing command line instructionPython:编写命令行指令时的字符串格式
【发布时间】:2018-04-24 18:25:39
【问题描述】:

我有一个任务,我必须每次运行一堆参数略有不同的模拟。我想编写一个 Python 脚本来自动执行此操作,但我遇到了问题。

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

from subprocess import call

<code>

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

但是,我在调用脚本时总是收到错误消息。谁能提出为什么会这样?

【问题讨论】:

  • 错误信息是什么? call 需要一个 args 列表,而不是一个字符串(除非你使用 shell=True,你应该避免使用它)。
  • 什么错误信息?
  • 仿真文件到底是什么?您的parameters[] 是否也包含文件扩展名? call('ca%s.exe' % 'lc') 为我工作(Win7)。

标签: python string arguments subprocess call


【解决方案1】:

如果您包含错误消息会很有帮助,但无论如何我都会尽力帮助您。

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 类似)。 我希望这适用于您的情况。

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2015-11-29
    • 2019-10-24
    • 2016-10-11
    相关资源
    最近更新 更多