इनपुट () त्रुटि - NameError: नाम '...' परिभाषित नहीं है


220

इस सरल स्क्रिप्ट को चलाने का प्रयास करने पर मुझे एक त्रुटि मिल रही है:

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

मैं इन लिपियों को पायथन 2.7 के साथ चला रहा हूं।


12
क्या आप सुनिश्चित हैं कि यह 3.3 पायथन है। मैं inputइस तरह से व्यवहार करने की उम्मीद करूंगा , लेकिन केवल 2.7 में। जब आप python --versionकमांड प्रॉम्प्ट से चलते हैं तो यह क्या कहता है ? वैकल्पिक रूप से, यदि आप import sys; print(sys.version)अपनी स्क्रिप्ट की शुरुआत में लिखते हैं तो क्या होगा ?
केविन

1
आप पायथन 3 नहीं चला रहे हैं। आप पायथन 2 चला रहे हैं, किसी तरह (मैं इस "पायथन लॉन्चर" ऐप से परिचित नहीं हूँ)
वूबल

1
यह पता लगाने के लिए कि आप किस संस्करण का उपयोग कर रहे हैं, पहली पंक्ति के import sysरूप में और दूसरी पंक्ति के रूप में रखें print(sys.version_info)
हाइपरबोरस

1
मैंने वही किया जो केविन ने कहा और यह संस्करण 2.7.5 है! हालांकि मुझे यकीन नहीं है कि कैसे। मैंने संस्करण 3.3 डाउनलोड और स्थापित किया, मेरे एप्लिकेशन फ़ोल्डर में एक फ़ोल्डर है जिसे "पायथन 3.3" कहा जाता है उस फ़ोल्डर के अंदर "पायथन लॉन्चर" नामक एक ऐप है और मैं पायथॉन लॉन्चर ऐप पर उन्हें खींचकर और ड्रॉप करके अपनी स्क्रिप्ट चला रहा हूं। । जब मैं 3.3 लॉन्चर ऐप का उपयोग कर रहा हूं तो मैं अभी भी 2.7 का उपयोग कैसे कर रहा हूं?
19 पेंग्विन में

2
@chillpenguin: पायथन लॉन्चर के लिए वरीयता संवाद देखें। जाहिरा तौर पर यह उस संस्करण को चलाने के लिए डिफ़ॉल्ट नहीं है जिसे इसके साथ स्थापित किया गया था, जो है ... गूंगा। (मैंने खुद इसे कभी इस्तेमाल नहीं किया है; मुझे लगता है कि टर्मिनल का उपयोग करना बेहतर है ...)
Wooble

जवाबों:


265

टी एल; डॉ

inputपायथन 2.7 में कार्य, पायथन अभिव्यक्ति के रूप में आपके जो कुछ भी दर्ज करता है, उसका मूल्यांकन करता है। यदि आप केवल स्ट्रिंग्स पढ़ना चाहते हैं, तो raw_inputपायथन 2.7 में फ़ंक्शन का उपयोग करें , जो रीड स्ट्रिंग्स का मूल्यांकन नहीं करेगा।

यदि आप पायथन 3.x का उपयोग कर रहे हैं, तो raw_inputइसका नाम बदल दिया गया है inputपायथन 3.0 रिलीज़ नोट का हवाला देते हुए ,

raw_input()का नाम बदल दिया गया input()। यही है, नए input()फ़ंक्शन से एक पंक्ति पढ़ता है sys.stdinऔर पीछे छोड़ी गई नई लाइन के साथ इसे वापस करता है। EOFErrorयदि इनपुट समय से पहले समाप्त हो जाता है तो यह बढ़ जाता है। के पुराने व्यवहार को प्राप्त करने के लिए input(), का उपयोग करेंeval(input())


पायथन 2.7 में , दो कार्य हैं जिनका उपयोग उपयोगकर्ता इनपुट को स्वीकार करने के लिए किया जा सकता है। एक है inputऔर दूसरा है raw_input। आप उन दोनों के बीच संबंध के बारे में सोच सकते हैं

input = eval(raw_input)

इसे बेहतर समझने के लिए कोड के निम्नलिखित टुकड़े पर विचार करें

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

inputउपयोगकर्ता से एक स्ट्रिंग को स्वीकार करता है और वर्तमान पायथन संदर्भ में स्ट्रिंग का मूल्यांकन करता है। जब मैं dudeइनपुट के रूप में टाइप करता हूं , तो यह पता चलता है कि यह dudeमूल्य के लिए बाध्य है thefourtheyeऔर इसलिए मूल्यांकन का परिणाम बन जाता है thefourtheyeऔर इसे सौंपा जाता है input_variable

यदि मैं कुछ और दर्ज करता हूं जो वर्तमान अजगर के संदर्भ में नहीं है, तो यह विफल हो जाएगा 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

पायथन 2.7 के साथ सुरक्षा विचार input:

चूंकि जो भी उपयोगकर्ता प्रकारों का मूल्यांकन किया जाता है, वह सुरक्षा मुद्दों को भी लागू करता है। उदाहरण के लिए, यदि आपने पहले से ही osअपने प्रोग्राम में मॉड्यूल लोड किया हुआ है import os, और फिर उपयोगकर्ता टाइप करते हैं

os.remove("/etc/hosts")

यह अजगर द्वारा एक फ़ंक्शन कॉल अभिव्यक्ति के रूप में मूल्यांकन किया जाएगा और इसे निष्पादित किया जाएगा। यदि आप एलिवेटेड विशेषाधिकारों के साथ पायथन को निष्पादित कर रहे हैं, तो /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: ")निष्पादित किया जाता है, तो यह उपयोगकर्ता इनपुट का इंतजार करता है और उपयोगकर्ता इनपुट एक वैध पायथन फ़ंक्शन मंगलाचरण है और इसलिए इसे भी आमंत्रित किया जाता है। यही कारण है कि हम Enter your name again:फिर से शीघ्र देख रहे हैं ।

तो, आप raw_inputइस तरह से फ़ंक्शन के साथ बेहतर हैं

input_variable = raw_input("Enter your name: ")

यदि आपको परिणाम को किसी अन्य प्रकार में बदलने की आवश्यकता है, तो आप वापस लौटे स्ट्रिंग को परिवर्तित करने के लिए उपयुक्त कार्यों का उपयोग कर सकते हैं raw_input। उदाहरण के लिए, पूर्णांक के रूप में इनपुट को पढ़ने के लिए, intफ़ंक्शन का उपयोग करें , जैसे इस उत्तर में दिखाया गया है ।

अजगर 3.x में , उपयोगकर्ता इनपुट प्राप्त करने के लिए केवल एक ही फ़ंक्शन है और इसे कहा जाता है input, जो कि पायथन 2.7 के बराबर है raw_input


56

आप पायथन 2 चला रहे हैं, पायथन 3 नहीं। इसके लिए पायथन 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

यह पायथन 2.x पर डिफ़ॉल्ट होगा। ये आपकी स्क्रिप्ट की पहली पंक्ति पर चलते हैं, अगर ऐसा कुछ नहीं है जो # से शुरू होता है ! (उर्फ शबंग)।

यदि आपकी स्क्रिप्ट अभी शुरू होती है:

#! python

तो आप इसे बदल सकते हैं:

#! python3

हालांकि इस छोटे प्रारूपण को केवल कुछ कार्यक्रमों द्वारा पहचाना जाता है, जैसे कि लांचर, इसलिए यह सबसे अच्छा विकल्प नहीं है।

पहले दो उदाहरण बहुत अधिक व्यापक रूप से उपयोग किए जाते हैं और यह सुनिश्चित करने में मदद करेंगे कि आपका कोड किसी भी मशीन पर काम करेगा, जिसमें पायथन स्थापित है।


6

आपको उपयोग करना चाहिए raw_inputक्योंकि आप अजगर-2.7 का उपयोग कर रहे हैं। जब आप input()एक चर (उदाहरण के लिए:) पर उपयोग करते हैं s = input('Name: '), तो यह आपके द्वारा चर पर लिखे गए ( sऔर) में लिखे गए बचत के बिना पायथन वातावरण पर कमांड को निष्पादित करेगा और यदि आपने जो लिखा है वह त्रुटि नहीं है।

raw_input()चर (उदाहरण के लिए f = raw_input('Name : ')) पर आपके द्वारा लिखे गए सही तरीके से सहेजेगा , और यह पायथन वातावरण में बिना किसी संभावित त्रुटि के इसे निष्पादित नहीं करेगा:

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

5

अजगर 3 और उससे अधिक के लिए

s = raw_input()

यह pycharm आईडीई पर समस्या को हल करेगा यदि आप ऑनलाइन साइट पर हल कर रहे हैं तो बिल्कुल हैकरेंक का उपयोग करें:

s = input()


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

आपको सिंगल या डबल कोट्स में इनपुट दर्ज करना होगा

Ex:'dude' -> correct

    dude -> not correct

4

मुझे एक मॉड्यूल के साथ इस मुद्दे का भी सामना करना पड़ा जो कि अजगर 2.7 और 3.7 के लिए संगत होना चाहिए था

इस समस्या को ठीक करने के लिए मुझे क्या आयात करना पड़ा:

from six.moves import input

यह दोनों दुभाषियों के लिए प्रयोज्यता तय करता है

आप यहां छह लाइब्रेरी के बारे में अधिक पढ़ सकते हैं


3

हम निम्नलिखित उपयोग कर रहे हैं जो अजगर 2 और अजगर 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)केविन के सुझाव के अनुसार शामिल किया है, तो अब आप देखेंगे कि स्क्रिप्ट की व्याख्या 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: "))
अपना नाम दर्ज करें: जो
('हाय', 'जो', <टाइप 'स्ट्र'>)
हाय जो, बाय 

आपका नाम: जो
जो

धन्यवाद!


1

इन मुद्दों को ठीक करने के दो तरीके हैं,

  • पहली बार कोड परिवर्तन के बिना सरल है
    जो Python3 द्वारा आपकी स्क्रिप्ट को चलाया जाता है,
    अगर आप अभी भी python2 पर चलना चाहते हैं तो अपनी अजगर स्क्रिप्ट को चलाने के बाद, जब आप इनपुट में प्रवेश कर रहे हैं तो ध्यान रखें

    1. यदि आप दर्ज करना चाहते हैं stringतो बस "इनपुट दोहरे-उद्धरण के साथ जाता है" टाइप करना शुरू करें और यह python2.7 और में काम करेगा
    2. यदि आप चरित्र दर्ज करना चाहते हैं तो इनपुट का उपयोग करें जैसे कि 'आपका इनपुट यहां चला जाता है'
    3. यदि आप नंबर दर्ज करना चाहते हैं तो कोई समस्या नहीं है आप बस संख्या टाइप करें
  • दूसरा तरीका कोड परिवर्तन के साथ
    है नीचे दिए गए आयात का उपयोग करें और अजगर के किसी भी संस्करण के साथ चलाएं

    1. from six.moves import input
    2. किसी भी आयात के साथ अपने कोड में raw_input()फ़ंक्शन के बजाय फ़ंक्शन का उपयोग करेंinput()
    3. अपने कोड को str()फंक्शन के साथ सैनिटाइज़ करें str(input())और फिर किसी भी वैरिएबल को असाइन करें

जैसा कि त्रुटि का तात्पर्य है :
नाम 'यार' परिभाषित नहीं है अर्थात अजगर के लिए 'यार' यहां परिवर्तनशील हो जाता है और इसमें निर्धारित अजगर प्रकार का कोई मूल्य नहीं होता है,
इसलिए केवल बच्चे की तरह इसका रोना रोता है, जैसे कि हम 'यार' चर को परिभाषित करते हैं और कोई मान निर्दिष्ट करते हैं और इसे पास करें, यह काम करेगा, लेकिन यह नहीं है कि हम क्या चाहते हैं क्योंकि हम नहीं जानते कि उपयोगकर्ता क्या दर्ज करेगा और इसके अलावा हम उपयोगकर्ता इनपुट पर कब्जा करना चाहते हैं।

इन विधि के बारे में तथ्य:
input() कार्य: यह फ़ंक्शन आपके द्वारा दर्ज किए गए इनपुट के मूल्य और प्रकार को लेता है, क्योंकि यह इस प्रकार को संशोधित किए बिना है।
raw_input() फ़ंक्शन: यह फ़ंक्शन स्पष्ट रूप से आपके द्वारा दिए गए इनपुट को स्ट्रिंग में परिवर्तित करता है,

नोट:
इनपुट () विधि में भेद्यता इस तथ्य में निहित है कि इनपुट के मूल्य को एक्सेस करने वाला वेरिएबल किसी के द्वारा केवल वेरिएबल या मेथड के नाम का उपयोग करके एक्सेस किया जा सकता है।


0

यदि आप पहले से ही अजगर 3.x डाउनलोड कर चुके हैं, तो आप किस अजगर का उपयोग कर सकते हैं, इसे बदल सकते हैं। लेकिन आपकी स्क्रिप्ट अजगर 3.x पर ठीक काम करती है, मैं बस बदलूंगा

print ("your name is" + input_variable)

सेवा

print ("your name is", input_variable)

क्योंकि अल्पविराम के साथ यह व्हाट्सएप के बीच प्रिंट करता है your name isऔर उपयोगकर्ता जो भी इनपुट करता है। और: यदि आप 2.7 का उपयोग कर रहे हैं तो केवल raw_inputइनपुट के बजाय उपयोग करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.