子流程.Popen('docker',标准输出=子流程.管道)重定向不仅适用于docker(&R)

2024-04-26 21:03:19 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用python3.7.4(通过自制程序安装)和docker 18.09.2(内部版本6247962)在OSX 10.14.6(18G84)上运行proc = subprocess.Popen('docker', stdout=subprocess.PIPE)时,标准输出将在控制台中打印,而不是被重定向

这只发生在'docker'-另一个子进程,例如'ls',通过proc.stdout.readlines()返回一些内容,而不是在控制台上打印其输出。在

另外,我通过在EC2实例(Amazon AMI 2,Docker 18.06.1-ce,Python 2.7.16&3.7.3)上运行相同的命令来确保这是OSX特有的问题,Docker子进程的proc.stdout.readlines()返回了expeed结果(控制台中没有输出,proc.stdout.readlines()包含Docker输出)。在

我在google上找到了一个SO post Problems capturing Python subprocess output on Mac OS X,但它似乎是python问题(python中的打字错误),而不是OSX问题。在

为什么是进程stdout.readlines()没有为“docker”返回任何内容?在


更多详情:

{a2的源代码不是open},而是一个命令

所以我决定自己修复它,调试它让我想到this code

...
import subprocess
...

def get_docker_commands():
    proc = subprocess.Popen('docker', stdout=subprocess.PIPE)
    lines = [line.decode('utf-8') for line in proc.stdout.readlines()]

docker作为子进程运行,然后由proc.stdout.readlines()读取其stdout,这就是问题的根源。在

所以我在python交互控制台中尝试了类似的命令,如下所示:

(在Mac OS上)

^{pr2}$

(在EC2实例上)

Python 3.7.3 (default, Jun 24 2019, 19:20:54) 
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> proc = subprocess.Popen('docker', stdout=subprocess.PIPE)
>>> proc.stdout.readlines()
(docker output as python list)

我没有包括结果,但Python的结果是一样的。(Mac和EC2都是Python 2.7.16)


Tags: 实例docker命令内容进程macstdoutproc