打印过程输出时多余的行

时间:2019-01-07 04:47:45

标签: python python-3.x

我有以下python3代码来打印两个文件/目录的差异:

def out_diff(arg1, arg2):
    out = subprocess.Popen(['diff', '-r', arg1, arg2], 
               stdout=subprocess.PIPE, 
               stderr=subprocess.STDOUT)
    stdout, stderr = out.communicate()
    print(type(stdout))
    print(type(stderr))
    if len(stdout) != 0:
        print('stdout: ', arg1, arg2, stdout.decode()),  # error line
    if stderr is not None:
        print('stderr: ', arg1, arg2, stderr)
    print('end of function')

out_diff('output1', 'output2')

其输出如下:

stdout:  output1 output2 diff: output1: No such file or directory
diff: output2: No such file or directory

end of function

我的问题是,是否在标准输出打印行(由“#”标记)上放置尾随逗号,总是打印空行。我不明白为什么会这样。某些内容应该根据尾随逗号的存在而更改。

我的期望是,因为在标准输出字符串中包含'\n',所以如果我不使用逗号结尾,则会打印2空行。

2 个答案:

答案 0 :(得分:1)

在Python 3中,print是一个始终返回None的函数。通过在调用之后添加逗号,您可以创建并立即丢弃元组(None,)而不是None。除了显着降低速度之外,这对代码没有任何影响。

要取消通常将print附加到其输出的换行符,您将需要传递仅关键字参数endend默认为\n。将其设置为''

print('stdout: ', arg1, arg2, stdout.decode(), end='')

正如您正确指出的那样,stdout.decode()很可能已经包含尾随换行符。

答案 1 :(得分:1)

目前尚不清楚您要在这里完成什么或实际要问什么。

在Python 3中,print()之后的逗号不执行任何操作。您可能将其与Python 2中print的行为(不带括号)混淆了,在末尾用逗号表示省略了最后的换行符。

无论如何,将标准错误重定向到标准输出,然后检查标准输出和标准错误似乎是一件很困惑的事情。

此外,Popen确实可以使用run

def out_diff(arg1, arg2):
    out = subprocess.run(['diff', '-r', arg1, arg2], 
               stdout=subprocess.PIPE, 
               stderr=subprocess.PIPE,   # Notice how this is distinct
               check=False,              # Be explicit that we tolerate errors from diff
               universal_newlines=True)  # Decode text
    print(type(out.stdout))
    print(type(out.stderr))
    if len(out.stdout) != 0:
        print('stdout: {0} {1} {2}'.format(arg1, arg2, out.stdout), end='')
    if len(out.stderr) != 0:
        print('stderr: {0} {1} {2}'.format(arg1, arg2, stderr), end='')
    print('end of function')

注意print(string, end='')将如何在Python 3中省略最后的换行符。

无论如何,与diff进行编程交互的正确方法是检查其退出状态(out.returncode)而不是其输出。