for loop in `Subprocess.run` results in `Syntax error: "do" unexpected`

for loop in `Subprocess.run` results in `Syntax error: "do" unexpected`

我正在尝试 运行 在 shell 到 python 中的 for 循环。 os.popen 运行 很好,但在 3.x 上已弃用,我想要 stderr。按照 How to use for loop in Subprocess.run command 上投票最高的答案得出 Syntax error: "do" unexpected,shellcheck 同意:

import subprocess
proc = subprocess.run(
    "bash for i in {1..3}; do echo ${i}; done",
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE, )

print(proc.stderr)

我最终试图通过调用此 shell 代码 https://unix.stackexchange.com/a/611305/362437 到 python 来重置所有 USB,因此任何替代方法也将不胜感激。

当你这样做时

subprocess.run('foo', shell=True)

实际上运行相当于

/bin/sh -c 'foo'

(除了它神奇地使所有引号都正确:-))。因此,在您的情况下,它执行

/bin/sh -c "bash for i in {1..3}; do echo ${i}; done"

所以用-c switch is actually a list三个命令给出的“命令”:bash for i in {1..3}do echo ${i}done。这会让您非常困惑 shell.

解决此问题的最简单方法可能是从字符串的开头删除 bash。这样,传递给 /bin/sh 的命令就有意义了。

如果您想明确地 运行 bash,您最好使用 shell=False 并为第一个参数使用列表以保持引用的完整性。像

import subprocess
proc = subprocess.run(
    ['/bin/bash', '-c', 'for i in {1..3}; do echo ${i}; done'],
    shell=False,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE, )