的區別在於CPython的2使用C STDIO實現標準流,如sys.stdin
,sys.stdout
(由print()
使用)而Python 3重新實現IO上系統API的頂部例如,打開,讀,寫上POSIX。
# __main__.py
import sys
sys.stdout.write("input: ")
f = sys.stdin.readline()
sys.stdout.write("*" + f)
關於Python 3 "input: "
是不readline()
調用之前打印:
$ python2 .
input: foo bar
*foo bar
$ python3 .
foo bar
input: *foo bar
在
爲了避免在思考如何print()
實現,如果sys.stdout
直接使用時會發生同樣的問題C,stdout
在讀取交互式案例中的任何輸入之前被刷新(如果輸出操作之後是在沒有01的同一更新流上進行輸入操作,則這是未定義的行爲之間)。這個C程序打印"input: "
要求輸入作爲之前的預期:
#include <stdio.h>
#define MAXLEN 100
int main(void) {
char buf[MAXLEN] = {0};
fputs("input: ", stdout);
if (!fgets(buf, MAXLEN, stdin))
return 1;
fputs(buf, stdout);
return 0;
}
這就是爲什麼解決方法:在調用sys.stdout.flush()
前sys.stdin.readline()
suggested by @Dietrich Epp作品。
這是Python 3實現中的一個缺陷。如果兩者都指向同一位置(os.path.samefile(sys.stdout.fileno(), sys.stdin.fileno())
,例如,如果兩個都是tty),則stdin在默認情況下從stdin讀取之前將被刷新。你可以report the issue at Python bug tracker。
來源
2014-10-19 13:17:44
jfs
Python 3中的I/O子系統是一次徹底的檢修(請參閱'io'模塊,也可以在Python 2中使用),所以沖洗行爲可能已經改變並不令人驚奇。 – 2014-10-19 10:03:05
@MartijnPieters,實際上,Dietrich Epp的解決方案是可行的。 – Oz123 2014-10-19 10:06:58
@MartijnPieters,你會怎麼做? – Oz123 2014-10-19 10:07:27