Python 2.x 和 Python 3.x 的脚本不兼容



我不明白 python3 发生了什么阻止它工作,当我尝试使用 python3 时,它只是挂在第 11 行。

import io,re,unittest,os,json,sys
from subprocess import PIPE, STDOUT, Popen
sub = Popen(["/usr/bin/python3.4", "test2.py", "pipe"], stdin=PIPE, stdout=PIPE, stderr=sys.stderr, close_fds=True, shell=False)
(writer,reader) = (sub.stdin, sub.stdout)
writer.write("HELOt1n".encode("utf-8"))
writer.flush()
sub.poll()
line = reader.readline().decode("utf-8")
assert(re.match("^OKt", line))
writer.write("Qttest.comtINtSOAt-1t127.0.0.1n".encode("utf-8"))
line = reader.readline().decode("utf-8")
assert(re.match("^DATAttest.comtINtSOAt300t-1tsns.dns.icann.org. noc.dns.icann.org. 2013073082 7200 3600 1209600 3600", line))
sub.stdout.close()
sub.stdin.close()
sub.kill()
sub.wait()

下面是上述代码调用的test2.py文件:

import sys
sys.stderr.write(sys.stdin.readline())
sys.stdout.write("OKtversion foo bar hellon")
sys.stdout.flush()
sys.stderr.write(sys.stdin.readline())
sys.stdout.write("DATAttest.comtINtSOAt300t-1tsns.dns.icann.org. noc.dns.icann.org. 2013073082 7200 3600 1209600 3600")
sys.stdout.flush()

在我的系统上,我重现了您的问题,并通过在您第二次writer.write()呼叫后添加一个writer.flush()来修复它。 例如:

import io,re,unittest,os,json,sys
from subprocess import PIPE, STDOUT, Popen
sub = Popen(["/usr/bin/python3.4", "test2.py", "pipe"], stdin=PIPE, stdout=PIPE, stderr=sys.stderr, close_fds=True, shell=False)
(writer,reader) = (sub.stdin, sub.stdout)
writer.write("HELOt1n".encode("utf-8"))
writer.flush()
sub.poll()
line = reader.readline().decode("utf-8")
assert(re.match("^OKt", line))
writer.write("Qttest.comtINtSOAt-1t127.0.0.1n".encode("utf-8"))
writer.flush() # <<< INSERTED FLUSH <<<
line = reader.readline().decode("utf-8")
assert(re.match("^DATAttest.comtINtSOAt300t-1tsns.dns.icann.org. noc.dns.icann.org. 2013073082 7200 3600 1209600 3600", line))
sub.stdout.close()
sub.stdin.close()
sub.kill()
sub.wait()
sub.wait()

如果主脚本在 Python 2 或 Python 3 中运行(测试:2.7 和 3.4),它现在可以正确执行

我之所以说"在我的系统上",是因为这种跨文本管道的交错读者-编写器协调本质上是脆弱的。当它工作得很好时,它就很棒!但是,系统、系统库、语言实现等处理 I/O 的方式的微小变化可能会给您带来各种各样的悲伤。

最新更新