让我们从考虑以下代码开始: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的(或行迭代)函数包含换行符的原因:它们对于准确表示文件的结尾是必要的。iter
readline
添加回答
举报
0/150
提交
取消