自定义 Popen.通信方法给出错误的输出

让我们从考虑以下代码开始:


proc_stdin.py


import sys


if __name__ == '__main__':

    for i, line in enumerate(sys.stdin):

        sys.stdout.write(line)

test.py


import subprocess



def run_bad(target, input=None):

    proc = subprocess.Popen(

        target,

        universal_newlines=True,

        shell=True,

        stderr=subprocess.STDOUT,

        stdin=subprocess.PIPE if input else subprocess.DEVNULL,

        stdout=subprocess.PIPE,

    )


    if input:

        proc.stdin.write(input)

        proc.stdin.flush()

        proc.stdin.close()


    lines = []

    for line in iter(proc.stdout.readline, ""):

        line = line.rstrip("\n")

        lines.append(line)

    proc.stdout.close()


    ret_code = proc.wait()

    return "\n".join(lines)



def run_good(target, input):

    return subprocess.Popen(

        target,

        universal_newlines=True,

        shell=True,

        stderr=subprocess.STDOUT,

        stdin=subprocess.PIPE,

        stdout=subprocess.PIPE,

    ).communicate(input=input)[0]



if __name__ == '__main__':

    lst = [

        "",

        "token1",

        "token1\n",

        "token1\r\n",

        "token1\n\n",

        "token1\r\n\ntoken2",

        "token1 token2",

        "token1\ntoken2",

        "token1\r\ntoken2",

        "token1\n\ntoken2",

        "token1\r\n\ntoken2",

        "token1 \ntoken2\ntoken2\n"

    ]

    cmd = "python proc_stdin.py"


    for inp in lst:

        a, b = run_bad(cmd, inp), run_good(cmd, inp)

        if a != b:

            print("Error: {} vs {}".format(repr(a), repr(b)))

        else:

            print("ok: {}".format(repr(a)))


我的问题是,为什么两者的输出在所有情况下都不相等?如何更改函数以使输出等于 ?run_badrun_goodrun_badrun_good


您可能还想知道,为什么不直接使用Popen.communicate来应对此特定情况或子流程模块中的其他助手?好吧,在现实世界的情况下,我正在为SublimeText3创建一个插件,这迫使我坚持使用python3.3(不能使用许多现代子流程的好东西),另外我想在从stdout读取行时注入一些回调,这是我使用该方法无法做到的(据我所知)。Popen.communicate


提前致谢。


慕田峪4524236
浏览 79回答 1
1回答

芜湖不芜

如果从每行中去除换行符,然后在行之间添加回换行符,则最后一个换行符(如果有)会发生什么情况?(在最后一个换行符之后没有最后的空行,因为您丢弃了它。这就是为什么Python的(或行迭代)函数包含换行符的原因:它们对于准确表示文件的结尾是必要的。iterreadline
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python