[英]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.