web-dev-qa-db-ja.com

input()エラー - NameError:名前 '...'が定義されていません

この単純な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を使うのですか?

178
chillpenguin

TL; DR

Python 2.7のinput関数は、入力したものがPython式として評価されます。単に文字列を読みたいのであれば、Python 2.7のraw_input関数を使ってください。これは読み込んだ文字列を評価しません。

Python 3.xを使用している場合、raw_inputinputに名前が変更されました。 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によって返される文字列を変換できます。たとえば、入力を整数として読み込むには、 this answer に示すようにint関数を使用します。

python 3.x には、ユーザー入力を取得する関数が1つだけあり、それは input と呼ばれます。これはPython 2.7のraw_inputと同等です。

237
thefourtheye

Python 3ではなくPython 2を実行しています。これをPython 2で機能させるには、raw_inputを使用します。

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
49
user2534732

あなたはPython 3.xのために書いているので、あなたはあなたのスクリプトを始めたいと思うでしょう:

#!/usr/bin/env python3

あなたが使用する場合:

#!/usr/bin/env python

デフォルトはPython 2.xです。 #で始まるものがない場合、これらはスクリプトの最初の行に移動します。 (別名Shebang).

あなたのスクリプトがただで始まるなら:

#! python

それからあなたはそれをに変更することができます:

#! python3

この短いフォーマットは、ランチャーなどのいくつかのプログラムでしか認識されないため、最良の選択ではありません。

最初の2つの例はもっと広く使われており、あなたのコードがPythonがインストールされているどのマシンでも動作することを保証するのに役立ちます。

13
Zim

あなたはpython-2.7を使っているのでraw_inputを使うべきです。変数にinput()を使用すると(例:s = input('Name: '))、変数に記述した内容(s)を保存せずにPython環境でコマンドを実行し、記述した内容が定義されていない場合はエラーを生成します。

raw_input()はあなたが変数に書いたものを正しく保存するでしょう(例えば:f = raw_input('Name : '))、そしてそれはいかなる可能なエラーも作成することなしにPython環境でそれを実行しません:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
6
Skiller Dz

Python 3以降の場合

s = raw_input()

それはpycharm IDE上の問題を解決するでしょうあなたが正確にオンラインサイトで解決しているならそれからそれを使用してください:

s = input()
4
RAHUL KUMAR
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

一重引用符または二重引用符のどちらかで入力を入力する必要があります

Ex:'dude' -> correct

    dude -> not correct
3
Parminder Singh

どちらでもできます。

x = raw_input("enter your name")
print "your name is %s " % x

または

x = str(input("enter your name"))
print "your name is %s" % x
2
Abdullah Baraka

python 2とpython 3 の両方で動作する以下を使用しています。

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
2
Hardian

この問題に遭遇する可能性のある他の誰にとっても、スクリプトの先頭に#!/usr/bin/env python3を含めても、ファイルが実行可能でない場合はShebangは無視されます。

ファイルが実行可能かどうかを確認するには

  • コマンドラインから./filename.pyを実行します。
  • -bash: ./filename.py: Permission deniedが出たら、chmod a+x filename.pyを実行してください。
  • ./filename.pyをもう一度実行してください

Kevinが示唆したようにimport sys; print(sys.version)をインクルードしたことがあれば、スクリプトはpython3によって解釈されていることがわかります。

2
automonous

IDEで使用しているPythonを変更することができます。Python3.xをすでにダウンロードしている場合は、切り替えがそれほど難しくないはずです。しかし、あなたのスクリプトはpython 3.xではうまく動きます。

print ("your name is" + input_variable)

print ("your name is", input_variable)

なぜならカンマでそれはyour name isとユーザーが入力したものは何でもの間に空白で印刷するからです。また、2.7を使用している場合は、入力の代わりにraw_inputを使用してください。

0
Cleve Green

私はまた、Python 2.7および3.7と互換性があるはずのモジュールでこの問題に遭遇しました。

私は問題を解決するために見つけたものはインポートしていました:

from six.moves import input

これは両方のインタプリタの使いやすさを修正しました

6つの図書館についてもっと読むことができます ここ

0
Elad L.

以前のものに良い貢献を。

import sys; print(sys.version)

def ingreso(nombre):
    print('Hi ', nombre, type(nombre))

def bienvenida(nombre):
    print("Hi "+nombre+", bye ")

nombre = raw_input("Enter your name: ")

ingreso(nombre)
bienvenida(nombre)

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name: "))
あなたの名前を入力してください。ジョー

ありがとうございます。

0
Joe Llerena