subprocess.Popen 输出:如何克服命令行执行的差异

Dom*_*que 1 python grep cygwin subprocess python-3.x

我正在编写一个 Python 脚本来比较两个文件。因此,我选择作为外部程序使用grep,启动以下两个命令:

grep -Fvf content1.txt content2.txt
grep -Fvf content2.txt content1.txt
Run Code Online (Sandbox Code Playgroud)

从这些命令的结果中可以看出差异,我可以通过计算行数来提取差异量。

为了在 Python 脚本中执行此操作,我将这些grep命令嵌入到subprocess.Popen()函数中:

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
Run Code Online (Sandbox Code Playgroud)

我已将两行有问题的行放在注释中(以(*))。

如您所见,问题如下:

  • 当我在命令提示符下启动命令时,得到的结果是一堆字符串。通过计算这些字符串的数量,我可以获得我想要的结果(例如使用 a wc -l)。

  • 当我在 Python 脚本中启动命令时,我得到的结果 (output1和output2) 是字节而不是字符串。

    我曾希望对字符串进行简单的类型转换将使我有机会计算换行符的数量,从而计算差异的数量,但这太容易了。

我尝试过使用wc -l但里面的管道subprocess.Popen()似乎不是一个好主意。

我如何处理output1和output2结果以搜索差异数量?

jfs*_*jfs 5

不要调用str()字节。这几乎总是一个错误。

要启用文本模式,请传递universal_newlines=True到subprocess.Popen().

或者您可以直接使用字节,例如,使用.count(b'\n')而不是.count('\n').