讓我們從考慮以下代碼開始: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提前致謝。
自定義 Popen.通信方法給出錯誤的輸出
慕田峪4524236
2022-09-13 10:07:48