首页 > 解决方案 > 子进程中带有变量的命令行

问题描述

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

变量是:

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 "])

但是语法有问题。我不知道是什么。我在 Windows 上使用 Python 3.6.8 运行它。

标签: pythonvariablessubprocesscommand

解决方案


我认为你迷失了字符串连接......你必须通过以下方式执行 cmd 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 为 True,建议将 `args 作为字符串而不是序列传递”

  • 查看Popen Constructor的文档以获取签名的完整描述


推荐阅读