繁体   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