TL; DR
input
Python 2.7の関数は、入力したものをすべてPython式として評価します。単に文字列を読み取りたい場合はraw_input
、Python 2.7の関数を使用します。これは、読み取った文字列を評価しません。
Python 3.xを使用している場合、はにraw_input
名前が変更されましたinput
。Python 3.0リリースノートを引用して、
raw_input()
に名前が変更されましたinput()
。つまり、新しいinput()
関数は行を読み取りsys.stdin
、末尾の改行を削除して返します。これは、発生させEOFError
た入力が途中で終了した場合。の古い動作を取得するにはinput()
、次を使用しますeval(input())
Python 2.7には、ユーザー入力を受け入れるために使用できる2つの関数があります。1つはでinput
、もう1つはraw_input
です。それらの関係は次のように考えることができます
input = eval(raw_input)
これをよりよく理解するために、次のコードを検討してください。
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
ユーザーから文字列を受け取り、現在のPythonコンテキストで文字列を評価します。私が入力するとdude
、入力として、それはそれが見つかったdude
値にバインドされているthefourtheye
ので、評価の結果になるthefourtheye
とそれがに割り当てられますinput_variable
。
現在のpythonコンテキストにない何か他のものを入力すると、失敗しNameError
ます。
>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined
Python 2.7のセキュリティに関する考慮事項input
:
ユーザータイプが評価されると、セキュリティの問題も発生します。たとえばos
、でプログラムにモジュールをすでにロードしていてimport os
、ユーザーが
os.remove("/etc/hosts")
これはpythonによって関数呼び出し式として評価され、実行されます。管理者特権でPythonを実行している場合、/etc/hosts
ファイルは削除されます。ほら、それがどれほど危険か?
これを示すために、input
関数をもう一度実行してみましょう。
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
これで、input("Enter your name: ")
が実行されると、ユーザー入力を待機します。ユーザー入力は有効なPython関数呼び出しであり、これも呼び出されます。そのため、Enter your name again:
再びプロンプトが表示されます。
だから、あなたはraw_input
このように機能でより良いです
input_variable = raw_input("Enter your name: ")
結果を他のタイプに変換する必要がある場合は、適切な関数を使用して、から返される文字列を変換できますraw_input
。たとえば、入力を整数として読み取るにはint
、この回答に示すような関数を使用します。
python 3.xでは、ユーザー入力を取得する関数は1つだけでinput
、これはと呼ばれます。これはPython 2.7の関数と同等raw_input
です。
input
このように動作することを期待しますが、2.7でのみです。python --version
コマンドプロンプトから実行するとどうなりますか?あるいは、import sys; print(sys.version)
スクリプトの最初に書くとどうなりますか?