我有以下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空行。
答案 0 :(得分:1)
在Python 3中,print
是一个始终返回None
的函数。通过在调用之后添加逗号,您可以创建并立即丢弃元组(None,)
而不是None
。除了显着降低速度之外,这对代码没有任何影响。
要取消通常将print
附加到其输出的换行符,您将需要传递仅关键字参数end
。 end
默认为\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
)而不是其输出。