子进程中带有变量的命令行

Command line with variables in subprocess

我想 运行 此命令在脚本的子进程中使用变量。

变量为:

filenames[k]

filenames 有很多名字(字符串),我可以用 k.

命令是:

python3 train.py "C:\Users\Tommy\data\"+filenames[k] "C:\Users\Tommy\data\"+filenames[k]+"_model" --choice A

我想运行脚本中的这个命令作为子进程:

subprocess.run([" python3 train.py "C:\Users\Tommy\data\"+filenames[k] "C:\Users\Tommy\data\"+filenames[k]+"_model" --choice A "])

但是语法有问题。我不知道是什么。 我 运行 这个 Python 3.6.8 在 Windows.

我认为你迷失了字符串连接...你必须通过 run 或类似的方式执行命令:作为字符串或作为列表(因为列表通常更具可读性!)

大小写:args 作为字符串

cmd = f'python3 train.py "C:\Users\Tommy\data\{filenames[k]}" "C:\Users\Tommy\data\{filenames[k]}+_model" --choice A'

subprocess.run(args=cmd, shell=True)

案例:args 作为列表

cmd = f'python3 train.py "C:\Users\Tommy\data\{filenames[k]}" "C:\Users\Tommy\data\{filenames[k]}+_model" --choice A'

cmd = cmd.split(' ') # provided that no white spaces in the paths!!

subprocess.run(args=cmd, shell=False)

备注:

  • “新”字符串连接非常方便 f"smt {variable} smt else" 其中变量是之前定义的变量

  • 如果您希望您的程序从 shell 启动,那么您需要添加一个 kwrags 参数 shell=True,默认为 False。在这种情况下,根据您选择 args 是字符串还是列表,您应该更加小心:从文档“如果 shell 为真,建议传递 `args作为字符串而不是序列

  • 查看docs,在Popen Constructor,获取签名的完整描述