このシンプルなPythonスクリプトを実行しようとすると、エラーが発生します。
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
例えば、"dude"と入力した場合、私が得ているエラーは以下の通りです。
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
私はMac OS X 10.9.1を使用しており、python 3.3のインストールに付属するPython Launcherアプリを使用してスクリプトを実行しています。
編集: 2.7でこれらのスクリプトを実行していることに気づきました。本当の質問は、バージョン3.3でスクリプトを実行するにはどうすればいいかということだと思います。私は、アプリケーションフォルダ内のPython 3.3フォルダ内にあるPython Launcherアプリの上にスクリプトをドラッグ&ドロップすれば、3.3を使ってスクリプトを起動することができると思いました。この方法ではまだ 2.7 でスクリプトが起動すると思います。では、どうやって3.3を使えばいいのでしょうか?
TL;DR。
Python 2.7 の input
関数は、入力された内容を Python の式として評価します。単に文字列を読みたい場合は、Python 2.7 の raw_input
関数を使用してください。これは読み込んだ文字列を評価しません。
Python 3.x を使用している場合、raw_input
は input
に名前が変更されています。引用:Python 3.0 release notes。
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
に関するセキュリティ上の注意点:。
ユーザーが入力したものは何でも評価されるので、セキュリティ上の問題も発生します。例えば、import os
で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
が返す文字列を変換することができます。例えば、入力を整数として読み取るには、this answerのように、int
関数を使います。
python 3.xでは、ユーザーの入力を取得する関数は1つしかなく、それはPython 2.7'の raw_input
に相当する input
と呼ばれるものです。
Python 3.xのために書いているので、スクリプトを次のように始めるといいでしょう。
#!/usr/bin/env python3
を使うと。
#!/usr/bin/env python
これらは、スクリプトの最初の行で、#!で始まるものが何もない場合に使用します(別名、shebang)。
もしあなたのスクリプトが
#! python
に変更することができます。
#! python3
この短いフォーマットは、ランチャーなどの一部のプログラムでしか認識されないので、最良の選択ではありませんが。
最初の2つの例はもっと広く使われていて、Pythonがインストールされているどんなマシンでもあなたのコードが確実に動作するようにしてくれます。