亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自定義 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 關注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號