簡體   English   中英

使用 \\n 從 python 腳本運行 shell 命令

[英]Running shell command from python script with \n

我正在嘗試運行 shell 命令

echo -e 'FROM busybox\nRUN echo "hello world"' | docker build -t myimage:latest -

從 jupyter notebook 使用子進程

我試過代碼

p = subprocess.Popen('''echo -e 'FROM busybox\nRUN echo "hello world"' | docker build -t myimage:latest - ''', shell=True)
p.communicate()

和一些使用 run() 或 call() 的迭代,但每次輸出都是

-e '來自busybox

似乎是換行符 \\n 導致了問題。 任何解決問題的想法?

\\n被 Python 解析為文字換行符。 您可以通過使用原始字符串來避免這種情況,

p = subprocess.run(
    r'''echo -e 'FROM busybox\nRUN echo "hello world"' | docker build -t myimage:latest - ''',
    shell=True, check=True)

但我建議運行單個進程並傳入 Python 的輸出; 這也避免了 shell ,這通常是可取的。

p = subprocess.run(['docker', 'build', '-t', 'myimage:latest', '-'],
    input='FROM busybox\nRUN echo "hello world"',
    text=True, check=True)

還要注意我們更喜歡subprocess.run()而不是更原始的subprocess.Popen() 正如文檔中所建議的,您希望盡可能避免使用此低級函數。 使用check=True我們還注意將任何子進程錯誤傳播到 Python 父進程。

printf一句, printfecho -e更通用,更便攜; 我通常會建議您完全避免使用echo -e

ideone演示與nl代替docker build演示了變化,而巧合的是證明你為什么要避免echo -e即使你的登錄shell是如擊(在這種情況下,你認為它應該被支持的,但subprocess不使用您的登錄外殼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM