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, )
我正在尝试 运行 在 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, )