我正在嘗試for通過 python 在 shell 中運行一個回圈。os.popen運行良好,但在 3.x 上已棄用,我想要標準錯誤。按照關于如何在 Subprocess.run 命令中使用 for 回圈的最高投票結果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)
我最終試圖通過 python 呼叫此 shell 代碼https://unix.stackexchange.com/a/611305/362437來重置所有 USB ,因此任何替代方法也將不勝感激。
uj5u.com熱心網友回復:
當你這樣做
subprocess.run('foo', shell=True)
它實際上運行相當于
/bin/sh -c 'foo'
(除了它神奇地使所有引號都正確:-))。所以,在你的情況下,它執行
/bin/sh -c "bash for i in {1..3}; do echo ${i}; done"
因此,開關給出的“命令”-c實際上是三個命令的串列bash for i in {1..3}: 、do echo ${i}和done。這會給你留下一個非常混亂的外殼。
解決這個問題的最簡單方法可能是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, )
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443859.html
標籤:Python python-3.x 重击 子进程
