[英]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
一句, printf
比echo -e
更通用,更便攜; 我通常會建議您完全避免使用echo -e
。
這ideone演示與nl
代替docker build
演示了變化,而巧合的是證明你為什么要避免echo -e
即使你的登錄shell是如擊(在這種情況下,你認為它應該被支持的,但subprocess
不使用您的登錄外殼)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.