我正在尝试将一个gnuplot的Python2封装器移植到Python3。大多数错误都很容易修复,但是与该项目的通信似乎表现出意外的行为。我已经在以下(丑陋的)代码片段中隔离了问题。
cmd = ['gnuplot']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
p.stdin.write("set terminal dumb 80 40\n")
p.stdin.write("plot '-' w p ls 1, '-' w p ls 2, '-' w p ls 3 \n")
p.stdin.write("1 2 3\n")
p.stdin.write("2 3 4\n")
p.stdin.write("\ne\n")
p.stdin.write("e\n")
p.stdin.write("e\n")
while True:
print(p.stdout.read(1),end="")
这段代码在Python2中可以执行并输出结果,但在Python3中无法执行。首先,它会抱怨字节和字符串的问题,所以我添加了
universal_newlines=True
。从那时起,我就不明白为什么stdout没有输出任何内容,并打印以下内容到stderr:
line 4: warning: Skipping data file with no valid points
line 5: warning: Skipping data file with no valid points
显然,这个问题出现在编码或通信过程中,因为我输入的命令是相同的,但我不知道该去哪里查找或如何调试它。欢迎任何建议。
cmd = ['tee', 'logfile']
,并逐字节比较两个logfile
。 - Charles Duffyp.stdin.flush()
或p.stdin.close()
。 - Charles Duffystderr=subprocess.PIPE
,那么很容易陷入死锁。 - Charles Duffybufsize=1
和universal_newlines=True
启用行缓冲(在Python 2中为bufsize=0,在Python 3中默认为bufsize=-1)。 - jfs