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


219

この単純なスクリプトを実行しようとすると、エラーが発生します。

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

これらのスクリプトをPython 2.7で実行しています。


12
Python 3.3でよろしいですか?私はinputこのように動作することを期待しますが、2.7でのみです。python --versionコマンドプロンプトから実行するとどうなりますか?あるいは、import sys; print(sys.version)スクリプトの最初に書くとどうなりますか?
ケビン

1
あなたはPython 3を実行していません
。Python2を

1
使用しているバージョンを確認するために、1行目import sysと2行目としてprint(sys.version_info)配置します。
Hyperboreus

1
私はケビンが言ったことをしました、そしてそれはバージョン2.7.5です!でもどうだかわかりません。バージョン3.3をダウンロードしてインストールしました。私のアプリケーションフォルダーには、「Python 3.3」というフォルダーがあり、その中に「Python Launcher」というアプリがあり、スクリプトをPython Launcherアプリにドラッグアンドドロップして実行しています。 。3.3ランチャーアプリを使用しているのに、なぜ2.7を使用しているのですか?
チルペンギン2014年

2
@chillpenguin:Python Launcherの[設定]ダイアログを確認してください。どうやら、それはそれが一緒にインストールされたバージョンを実行するようにデフォルトではありません、つまり...ばかげています。(私は自分で使用したことがありません。ターミナルを使用する方が良いと思います...)
Wooble

回答:


265

TL; DR

inputPython 2.7の関数は、入力したものをすべてPython式として評価します。単に文字列を読み取りたい場合はraw_input、Python 2.7の関数を使用します。これは、読み取った文字列を評価しません。

Python 3.xを使用している場合、はにraw_input名前が変更されましたinputPython 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です。


56

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

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

17

Python 3.x用に記述しているので、スクリプトを次のように開始する必要があります。

#!/usr/bin/env python3

使用する場合:

#!/usr/bin/env python

デフォルトはPython 2.xです。これらは、#!で始まるものがない場合、スクリプトの最初の行に配置されます(別名シバン)。

スクリプトが次で始まる場合:

#! python

次に、次のように変更できます。

#! python3

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

最初の2つの例ははるかに広く使用されており、Pythonがインストールされているすべてのマシンでコードを確実に機能させるのに役立ちます。


6

raw_inputpython-2.7を使用しているため、使用する必要があります。input()変数(例:)を使用すると、変数(s = input('Name: '))に書き込んだ内容を保存せずにPython環境でコマンドが実行され、s定義が定義されていない場合はエラーが発生します。

raw_input()変数に書き込んだ内容(例:)を正しく保存f = raw_input('Name : ')し、Python環境でエラーを発生させずに実行しません。

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

5

Python 3以降の場合

s = raw_input()

オンラインサイトで正確にハッカーランクを解決している場合は、pycharm IDEで問題を解決し、次を使用します。

s = input()

4

あなたはどちらかをすることができます:

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

または:

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

1
raw_inputで問題が解決しました
Spencer Goff

しかし、raw_input()は3 Pythonで使用できません
carthurs

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

入力は一重引用符または二重引用符で入力する必要があります

Ex:'dude' -> correct

    dude -> not correct

4

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

私が問題を修正するために見つけたものはインポートされていました:

from six.moves import input

これにより、両方の通訳者の使いやすさが修正されました

あなたはここで 6つのライブラリについてもっと読むことができます


3

私たちはPython 2とPython 3の両方で機能する次のものを使用しています

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

2

この問題に遭遇する可能性のある他の誰にとっても#!/usr/bin/env python3、スクリプトの最初にインクルードしても、ファイルが実行可能でなければ、シバンは無視されることがわかります。

ファイルが実行可能かどうかを判断するには:

  • ./filename.pyコマンドラインから実行する
  • あなたが得るなら-bash: ./filename.py: Permission denied、走るchmod a+x filename.py
  • ./filename.pyもう一度走る

import sys; print(sys.version)Kevinの提案どおりに含めた場合、スクリプトがpython3によって解釈されていることがわかります。


2

以前のものは良い貢献でした。

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: "))
名前を入力してください:Joe
( 'こんにちは'、 'ジョー'、<type 'str'>)
こんにちは、ジョー、バイ 

あなたの名前:ジョー
ジョー

ありがとう!


1

これらの問題を修正するには2つの方法があります。

  • 1つ目は
    、Python3でスクリプトを実行する コードを変更せずに簡単
    です。それでもpython2で実行したい場合は、Pythonスクリプトを実行した後、入力を入力するときに注意してください

    1. string入力したい場合は、「入力は二重引用符で囲みます」で入力を開始するだけで、python2.7および
    2. 文字を入力したい場合は、「あなたの入力がここに入る」のように単一引用符で入力を使用します
    3. 問題ではなく番号を入力する場合は、単に番号を入力します
  • 2番目の方法は、コードの変更
    で以下のインポートを使用し、Pythonの任意のバージョンで実行します

    1. from six.moves import input
    2. コードraw_input()input()関数を使用する代わりに関数を使用する
    3. str()ような関数でコードをサニタイズしてstr(input())から、任意の変数に割り当てます

エラーが暗示するように
「男は」ここで、変数となっ名「男」のPython用すなわち定義されておらず、それが割り当てられたのpython定義されたタイプのいずれかの値が持っていない
私たちは「男」変数を定義し、任意の値を割り当てるので、もしこれだけのは、赤ん坊のように泣いてをそれを渡すと機能しますが、ユーザーが入力する内容がわからないため、それは望みどおりではありません。さらに、ユーザー入力をキャプチャする必要があります。

これらの方法についての事実:
input()関数:この関数は、タイプを変更せずに、入力した入力の値とタイプをそのまま使用します。
raw_input() 関数:この関数は、入力を明示的に文字列型に変換します。

注:
input()メソッドの脆弱性は、入力の値にアクセスする変数が、変数またはメソッドの名前を使用するだけで誰でもアクセスできるという事実にあります。


0

IDEで使用しているpythonを変更できます。すでにpython 3.xをダウンロードしている場合は、切り替えが難しくありません。しかし、スクリプトはpython 3.xで正常に動作します。変更するだけです。

print ("your name is" + input_variable)

print ("your name is", input_variable)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.