如何检查python子进程中是否没有输出?

时间:2018-02-15 18:24:09

标签: python

我使用python3。这是我的脚本的一部分:

proc = subprocess.Popen(["git", "ls-remote", "--heads", "origin", "master"],stdout=subprocess.PIPE)
line = proc.stdout.readline()
if line != '':
    print("not empty")
    print(line)
else:
    print(empty)

我想检查是否有远程主控。如果' line'的内容不是空的(=有一个主人)它会打印"不是空的"。如果没有master =没有输出我想打印空。

但它不起作用:

这是没有python的输出:

$ git ls-remote --heads origin xxx (no output)
$ git ls-remote --heads origin master (output)
a5dd03655381fcee94xx4e759ceba7aeb6456   refs/heads/master

这是我运行脚本时的输出:

master exisits

b'a5dd03655381fcee94xx4e759ceba7aeb6456\trefs/heads/master\n'

master不存在:

b''

我该如何使这项工作?似乎管道似乎采用了不同的标志,如b''\n,而不仅仅是单词。

1 个答案:

答案 0 :(得分:2)

您将获得二进制字符串作为输出;许多程序执行内部解码并向您显示文本字符串,但subprocess.Popen不是其中之一。

但你可以自己轻松解码:

out_bin = b'a5dd03655381fcee94xx4e759ceba7aeb6456\trefs/heads/master\n'
out_txt = out.decode('utf-8')  # Should be `utf-8` encoded

\t\n是标签和换行符,它们会在print时执行相应的格式设置。

此外,文本字符串的所有方法也适用于二进制字符串,它只是不同的实现/表示。

此外,在if line != '':条件下,您需要通过以下方式明确告知您与二进制字符串匹配:

if line != b'':

或者更好,因为Python中的空字符串是假的,只需执行:

if not line: