python - 从 python 脚本运行 shell 命令\n

标签 python docker shell subprocess jupyter

我正在尝试运行 shell 命令

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

使用子进程从 jupyter 笔记本

我已经尝试过代码

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

还有一些使用 run() 或 call() 的迭代,但每次输出都是

-e 'FROM 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 的输出;这也是avoids a 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 父进程。

顺便说一句,printfecho -e 更通用、更可移植;我通常建议您完全避免 echo -e

这个ideone demo with nl instead of docker build演示了这些变化,并且巧合地证明了为什么您想要避免 echo -e 即使您的登录 shell 是例如Bash(在这种情况下,您认为应该支持它;但 subprocess 不使用您的登录 shell)。

关于python - 从 python 脚本运行 shell 命令\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68432586/

相关文章:

python - 欧拉-马歇罗尼常数

python - 在 Python 上使用 Jupyter 时出现语法错误

linux - 如何在 Linux 上使用 "echo"进行 HTTP POST/PUT 请求

linux - 如何防止在 Linux 中重复更改文本文件?

python - 有缺陷的随机数生成器?

docker - 其他PC无法访问K8S仪表板

docker - 带有app + DB的容器

mongodb - 带有副本集的 Mongo 容器,在 docker-compose 中只有一个节点

regex - Awk:如何处理文件夹和子文件夹中的多个 files.txt?

python , flask : Executemany with multiple fields in HTML form