我正在尝试运行 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 父进程。
顺便说一句,printf
比 echo -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/