subprocess.Popen.communicate 毫无例外地返回一个元组

Alg*_*bra 3 python

我正在使用以下命令练习子流程操作:

In [1]: import subprocess
In [3]: cp = subprocess.Popen("cat /etc/group", shell=True, stdout=subprocess.PIPE, stderr=sub
   ...: process.PIPE).communicate()
In [4]: cp
Out[4]: 
(b'root:x:0:\nbin:x:1:\ndaemon:x:2:\nsys:x:3:\nadm:x:4:\ntty:x:5:\ndisk:x:6:\nlp:x:7:\nmem:x:8:\nkmem:x:9:\nwheel:x:10:\ncdrom:x:11:\nmail:x:12:postfix\nman:x:15:\ndialout:x:18:\nfloppy:x:19:\ngames:x:20:\ntape:x:30:\nvideo:x:39:\nftp:x:50:\nlock:x:54:\naudio:x:63:\nnobody:x:99:\nusers:x:100:\nutmp:x:22:\nutempter:x:35:\nssh_keys:x:999:\ninput:x:998:\nsystemd-journal:x:190:\nsystemd-network:x:192:\ndbus:x:81:\npolkitd:x:997:\npostdrop:x:90:\npostfix:x:89:\nchrony:x:996:\nsshd:x:74:\nntp:x:38:\ntcpdump:x:72:\nnscd:x:28:\nnginx:x:995:\nstapusr:x:156:\nstapsys:x:157:\nstapdev:x:158:\ntss:x:59:\nmysql:x:27:\ntest:x:1000:\nscreen:x:84:\n',
 b'')
Run Code Online (Sandbox Code Playgroud)

当我尝试解码它时:

In [5]: out = cp.stdout.read().decode("utf-8")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-4f20648dd0bc> in <module>()
----> 1 out = cp.stdout.read().decode("utf-8")

AttributeError: 'tuple' object has no attribute 'stdout'
Run Code Online (Sandbox Code Playgroud)

尝试过替代方案

In [6]: out = cp.decode("utf-8")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-853060f6d163> in <module>()
----> 1 out = cp.decode("utf-8")

AttributeError: 'tuple' object has no attribute 'decode'
Run Code Online (Sandbox Code Playgroud)

它如何返回一个元组?我一步步遵循答案python - 使用任意变量保存 subprocess.Popen 的输出 - Thinbug

iBu*_*Bug 5

抱歉,是我的错。我在回答您链接的问题时犯了一个错误。

的返回值Popen.communicate()是一个包含 stdout 和 stderr 的元组,因此您需要选择您想要的:

cp[0].decode('utf-8')  # cp[1] if you want stderr
Run Code Online (Sandbox Code Playgroud)

另一种方法是删除.communicate()并读取程序输出:

proc = Popen("cat /etc/group", shell=True, stdout=subprocess.PIPE)
out = proc.stdout.read().decode("utf-8") 
Run Code Online (Sandbox Code Playgroud)