違い - python エラー処理




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

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

print ("your name is" + input_variable)

print ("your name is", input_variable)

カンマで、 your name is間に空白を入れて、ユーザが入力したものを印刷しyour name is 。 AND:2.7を使用しているraw_inputは、入力の代わりにraw_inputを使用してraw_input

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

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

私は "男"と入力すると、私が得るエラーは次のようになります:

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でスクリプトをどのように動かすのかということですね。 3.3を使用してスクリプトを起動する私のアプリケーションフォルダ内のPython 3.3フォルダの中にあるPython Launcherアプリケーションの上にスクリプトをドラッグアンドドロップしたと思った。 私はこの方法はまだ2.7でスクリプトを起動すると思います。 どうすれば3.3を使用できますか?


Python-2.7を使用しているので、raw_inputを使うべきです。変数の例でinput()を使用すると、s = input( 'Name:')、Python Environementでコマンドを実行します。あなたが書いたものが定義されていない場合、raw_input()を使用すると、変数に書き込んだものを正しく保存します(例:f = raw_input( 'Name:'))。可能性のあるエラーを作成せずにpython環境で実行する

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

TL; DR

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

Python 3.xを使用している場合、 raw_input名前がinput変更されました。 Python 3.0のリリースノートを引用すると、

raw_input()名前がinput() raw_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は値input_variableバインドされているので、評価の結果はinput_variableなり、 input_variableに割り当てられinput_variable

私が現在のpythonコンテキストに存在しないものを入力すると、 NameErrorが失敗し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:ことを見ているEnter your name again:再度プロンプト。

ですから、あなたはraw_input関数をraw_input方が良いでしょう。

input_variable = raw_input("Enter your name: ")

結果を他の型に変換する必要がある場合は、適切な関数を使用してraw_inputによって返された文字列を変換できます。 たとえば、入力を整数で読み取るには、 この回答に示すようにint関数を使用します 。

Python 3.xでは 、ユーザー入力を取得する関数が1つしかなく、これはinputと呼ばれ、Python 2.7のraw_inputと同等raw_input


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

#!/usr/bin/env python3

あなたが使用する場合:

#!/usr/bin/env python

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

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

#! python

次に、それを次のように変更することができます。

#! python3

この短い書式設定はランチャーなどのいくつかのプログラムでしか認識されませんが、最適な選択ではありません。

最初の2つの例ははるかに広く使用されており、Pythonがインストールされているマシンでコードが確実に動作するようになります。


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

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

または:

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

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

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

  • コマンドラインから./filename.pyを実行する
  • -bash: ./filename.py: Permission denied場合-bash: ./filename.py: Permission deniedchmod a+x filename.py実行しchmod a+x filename.py
  • ./filename.pyもう一度実行

import sys; print(sys.version)場合import sys; print(sys.version) Kevinが示唆したようにimport sys; print(sys.version)を実行すると、スクリプトがpython3によって解釈されていることがわかります







nameerror