为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2022-09-13 10:07:48
让我们从考虑以下代码开始:proc_stdin.pyimport sysif __name__ == '__main__':    for i, line in enumerate(sys.stdin):        sys.stdout.write(line)test.pyimport subprocessdef 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提前致谢。
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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



查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信