2

Python 3.2 で__future__モジュールの奇妙な動作を観察しました。print_function

たとえば、次のコードを見てください。

from __future__ import print_function
import sys

print('Enter the base path of the images: ', end='')
path = sys.stdin.readline().strip().strip('"')
if len(path) == 0:
    print("No path entered")
else:
    print(root)
print("\n\nPress ENTER to exit")
exit = sys.stdin.readline()

スクリプトが実行されると、コンソールはユーザーが押すのを待ってからENTER最初のprintステートメントを表示するように見えます。
出力は次のようになります。

画像のベース パスを入力してください: パスが入力されていません


ENTER を押して終了します

多くの人が白いテキストの黒いウィンドウ (コマンド プロンプト) を恐れているため、空のプロンプトをユーザーに表示すると、多くの混乱が生じることは言うまでもありません。

コードをこのように変更すると

from __future__ import print_function
import sys

print('\nEnter the base path of the images: ', end='') #line now starts with \n
path = sys.stdin.readline().strip().strip('"')
if len(path) == 0:
    print("No path entered")
else:
    print(path)
print("\n\nPress ENTER to exit")
exit = sys.stdin.readline()

次に、出力は期待どおりです (前の空の行を無視すると仮定します)。

イメージのベース パスを入力します: c:\
c:\


ENTER を押して終了します

ただし、コードが python 2.6 で実行されると、最初のコードは期待どおりに動作します (つまり、入力の受信を待つEnter the base path of the images: 前に表示されます)。

これにより、次のように質問するようになります: Python 2.6 で実行する場合は必要ないのに、Python 3.2 で表示される出力を取得するために関数
の前に a を付ける必要があるのはなぜですか? 2 つのバージョンで の実装が異なる可能性がありますか ?print\n\n
print_function

4

2 に答える 2

5

行バッファリングの効果が見られます。stdout最初にフラッシュします ( sys.stdout.flush()Python 2 との後方互換性のために使用):

print('Enter the base path of the images: ', end='')
sys.stdout.flush()

Python 2のprint()関数は、Python 3 の関数とは確かに異なります (from __future__ import print_function行は事実上無意味です)。Python 3 では、I/O が見直され、stdoutバッファリングのセマンティクスが微妙に変更されました。Python 2 ではsys.stdin.readline()呼び出しは自動的にフラッシュstdoutされますが、Python 3 ではそうではなくなりました。

input()直接読み取る代わりに関数を使用する場合はstdin、フラッシュする必要はまったくありません。

msg = 'Enter the base path of the images: '
try:
    # python 2
    path = raw_input(msg)
except NameError:
    # python 3
    path = input(msg)
于 2013-02-01T13:03:11.537 に答える
2

この場合、Python のバージョンを確認し、適切な「入力」関数に置き換えます。これで、inputユーザーの操作が必要な場所で使用できるようになりました。

from __future__ import print_function
import sys

if sys.version_info < (3,):
    input = raw_input

path = input('Enter the base path of the images> ').strip().strip('"')
if len(path) == 0:
    print("No path entered")
else:
    print(path)

print("\n\nPress ENTER to exit")
exit = input()
于 2013-02-01T13:09:20.100 に答える