【问题标题】:Command line with variables in subprocess [duplicate]子进程中带有变量的命令行[重复]
【发布时间】:2021-09-02 09:19:20
【问题描述】:

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

变量是:

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 运行它。

【问题讨论】:

  • 传递给run() 的第一个参数应该是一个字符串列表。您可以预先构建此列表。我建议你这样做。
  • filenames[1] 是 data1.csv,格式可以是 "C:\Users\Tommy\data\\"+%s % filenames[k]
  • @Tommy 如果您对路径格式有疑问,请使用标准库 os.path.join(...) 中的 os.path 包。它与平台无关,(不确定)应该转义“奇怪”字符
  • 我的意思是首先创建一个args 列表。即:args = ['python3', 'train.py', os.path.join(r'C:\Users\Tommy\data', filenames[k]), os.path.join(r'C:\Users\Tommy\data', filenames[k], "_model"), '--choice A'],然后在单独的行上调用subprocess.run(args)

标签: python variables subprocess command


【解决方案1】:

我认为你迷失了字符串连接......你必须使用run或这样的方法来执行cmd:作为字符串或列表(因为列表通常更具可读性!)

案例: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 作为字符串而不是作为一个序列”

  • 查看docs,在Popen Constructor,了解签名的完整描述

【讨论】:

  • 是否使用列表与shell=True无关。
  • @martineau 是的,我同意你的观点,但从文档中“如果 shell 为 True,建议将 args 作为字符串而不是序列传递”......出于教学原因,我过于简化了
  • 在这种情况下,我认为目的不能证明手段(错误信息)是合理的。我也不记得曾经在文档中看到过该建议。
  • 更糟糕的是,要执行的“train.py”脚本需要来自 linux data/data1.csv 的路径我不知道编译器在 Python 中是如何工作的。它只是希望路径的语法符合系统,还是吞下从 / (Linux) 到 \ (Windows) 本身的变化?
  • 我只是尝试了@martineau 的“args”提案,但我更改了“python train.py”中的“python3 train.py ...”,现在它运行了!嗯....疯了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2022-01-19
  • 2018-09-15
  • 2015-01-03
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多