我正在研究Python脚本来比较两个文件。因此,我已选择了与grep
工作作为外部程序,启动以下两个命令:subprocess.Popen输出:如何克服命令行执行的差异
grep -Fvf content1.txt content2.txt
grep -Fvf content2.txt content1.txt
从这些命令的结果给我的差异,我可以通过计数线量提取的差的量。
为了在Python脚本来执行这一点,我在subprocess.Popen()
功能嵌入那些grep
命令:
try:
output1, errors1 = subprocess.Popen(
["c:\\cygwin\\bin\\grep", "-Fvf", "content1.txt", "content2.txt"],
shell=True, stdout=PIPE, stderr=PIPE).communicate()
output2, errors2 = subprocess.Popen(
["c:\\cygwin\\bin\\grep", "-Fvf", "content2.txt", "content1.txt"],
shell=True, stdout=PIPE, stderr=PIPE).communicate()
if (len(output1) + len(output2) + len(errors1) + len(errors2) > 0):
print("Result : there are differences:")
if (len(output1) + len(output2) > 0):
print(" Output differences : ")
print(output1)
# print (str(str(output1).count('\n'))); (*)
print(output2)
# print (str(str(output2).count('\n'))); (*)
if (len(errors1) + len(errors2) > 0):
print(" Errors : ")
print(errors1)
print(errors2)
else:
print("Result : both are equal")
except Exception as ex:
print("Result : Exception during comparison:")
print(ex)
raise
我已经把在评论这两个问题的线(谁与(*)
结束的)。
正如你所看到的问题如下:
当我在命令提示符启动命令,这是我得到的结果是一串字符串。通过计算这些字符串的数量,我可以得到我想要的结果(例如使用
wc -l
)。当我在Python脚本中启动命令时,得到的结果(
output1
和output2
)是字节而不是字符串。我曾希望对字符串进行简单的类型转换可以让我有机会计算换行符的数量,并计算差异的数量,但这太容易了。
我已经使用wc -l
但subprocess.Popen()
管道内部尝试似乎不是一个好主意。
如何处理output1
和output2
结果以便搜索差异数量?
我看到你正在使用cygwin,你可能想尝试在subprocess.Popen调用中添加'universal_newlines = True'。 – secolive
你有没有使用外部grep而不是来自标准库的'difflib'模块的特殊原因? –
你好,Serge,我是一个Python新手,我不知道'difflib'模块,我已经试过'filecmp',但是我并不满意。现在我将更近距离观察'difflib'。感谢您的提议。 – Dominique