我正在研究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