ইনপুট () ত্রুটি - 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

আমি পাইথন ২.7 দিয়ে এই স্ক্রিপ্টগুলি চালাচ্ছি।


12
আপনি কি নিশ্চিত যে এটি পাইথন ৩.৩? আমি inputএইভাবে আচরণ করার আশা করব , তবে কেবল ২.7-এ। আপনি python --versionকমান্ড প্রম্পট থেকে চালালে এটি কী বলে ? বিকল্পভাবে, আপনি যদি import sys; print(sys.version)আপনার স্ক্রিপ্টের শুরুতে লিখেন ?
কেভিন

1
আপনি পাইথন 3 চালাচ্ছেন না You're আপনি পাইথন 2 চালাচ্ছেন, একরকম (আমি এই "পাইথন লঞ্চার" অ্যাপ্লিকেশনটির সাথে পরিচিত নই)
Wooble

1
আপনি কোন সংস্করণ ব্যবহার করছেন তা নির্ধারণের জন্য প্রথম লাইন import sysএবং দ্বিতীয় লাইন হিসাবে রাখুন print(sys.version_info)
হাইপারবোরিয়াস

1
কেভিন যা বলেছিলেন আমি তা করেছি এবং এটি সংস্করণ ২.7.৫! আমি যদিও নিশ্চিত না। আমি সংস্করণ ৩.৩ ডাউনলোড এবং ইনস্টল করেছি, আমার অ্যাপ্লিকেশন ফোল্ডারে একটি ফোল্ডার রয়েছে যেটিকে "পাইথন ৩.৩" বলা হয় সেই ফোল্ডারে "পাইথন লঞ্চার" নামে একটি অ্যাপ্লিকেশন রয়েছে এবং আমি আমার স্ক্রিপ্টগুলি পাইথন লঞ্চার অ্যাপটিতে টেনে এনে ফেলে দিয়ে চালাচ্ছি running । আমি যখন 3.3 লঞ্চার অ্যাপটি ব্যবহার করছি তখন কীভাবে আমি এখনও 2.7 ব্যবহার করব?
চিলপেনগুইন

2
@ চিল্পেপেনগুইন: পাইথন লঞ্চারের জন্য পছন্দসমূহ ডায়ালগটি দেখুন। স্পষ্টতই এটি ইনস্টল করা সংস্করণটি চালানোর জন্য ডিফল্ট হয় না, যা ... বোবা। (আমি নিজেই এটি কখনও ব্যবহার করি নি; টার্মিনালটি ব্যবহার করা ভাল বলে মনে করি ...)
উবল

উত্তর:


265

টি এল; ডিআর

inputপাইথন ২.7 এ ফাংশন, পাইথন এক্সপ্রেশন হিসাবে আপনার প্রবেশের যা কিছু তা মূল্যায়ন করে। আপনি যদি কেবল স্ট্রিংগুলি পড়তে চান তবে raw_inputপাইথন ২.7 এ ফাংশনটি ব্যবহার করুন , যা পঠনের স্ট্রিংগুলির মূল্যায়ন করবে না।

আপনি যদি পাইথন ৩.x ব্যবহার raw_inputকরছেন তবে নামকরণ করা হয়েছে inputপাইথন 3.0.০ রিলিজ নোটের উদ্ধৃতি ,

raw_input()নামকরণ করা হয়েছিল input()। অর্থাত, নতুন input()ফাংশনটি একটি লাইন পড়ে sys.stdinএবং এটি পিছনে থাকা নতুন লাইনের সাথে ফেলা হয়। এটি উত্থাপন করে EOFErrorযদি ইনপুট অকালে শেষ করে দেওয়া হয়। এর পুরানো আচরণ পেতে input(), ব্যবহার করুনeval(input())


পাইথন ২.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

পাইথন ২.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ফাংশন, দেখানো মত এই উত্তর

পাইথন ৩.x এ ব্যবহারকারীর ইনপুট পেতে একটি মাত্র ফাংশন রয়েছে এবং তাকে বলা হয় input, যা পাইথন ২.7 এর সমান raw_input


56

আপনি পাইথন 2 চালাচ্ছেন, পাইথন ৩ নয় this পাইথন 2 এ কাজ করার জন্য, ব্যবহার করুন raw_input

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

17

যেহেতু আপনি পাইথন ৩.x এর জন্য লিখছেন, আপনি আপনার স্ক্রিপ্টটি এখানে দিয়ে শুরু করতে চান:

#!/usr/bin/env python3

আপনি যদি ব্যবহার করেন:

#!/usr/bin/env python

এটি পাইথন ২.x এ ডিফল্ট হবে। এগুলি আপনার স্ক্রিপ্টের প্রথম লাইনে চলে যায়, যদি # দিয়ে শুরু হয় এমন কিছু না থাকে ! (ওরফে শেবাং)

যদি আপনার স্ক্রিপ্টগুলি কেবল এর সাথে শুরু হয়:

#! python

তারপরে আপনি এটিকে পরিবর্তন করতে পারেন:

#! python3

যদিও এই সংক্ষিপ্ত ফর্ম্যাটিংটি কেবলমাত্র কয়েকটি প্রোগ্রাম যেমন লঞ্চ হিসাবে স্বীকৃত, তাই এটি সেরা পছন্দ নয়।

প্রথম দুটি উদাহরণ অনেক বেশি ব্যবহৃত হয় এবং পাইথন ইনস্টল থাকা যে কোনও মেশিনে আপনার কোড কাজ করবে তা নিশ্চিত করতে সহায়তা করবে।


6

আপনার ব্যবহার করা উচিত raw_inputকারণ আপনি অজগর -২.। ব্যবহার করছেন। আপনি যখন 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()

এটি পাইচার্ম আইডিইতে সমস্যাটি সমাধান করবে যদি আপনি অনলাইনে ঠিক হ্যাকাররাঙ্কে সমাধান করছেন তবে ব্যবহার করুন:

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
কাঁচা_পিন্ডটি আমার জন্য সমস্যাটি স্থির করেছে
স্পেনসার গফ

তবে কাঁচা_পিন্ড () পাইথন 3 তে উপলভ্য নয়
কার্থার্স

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

আপনাকে একক বা ডাবল উদ্ধৃতিতে ইনপুট প্রবেশ করতে হবে

Ex:'dude' -> correct

    dude -> not correct

4

অজগর ২.7 এবং ৩. with এর জন্য উপযুক্ত বলে মনে করা হয়েছিল এমন একটি মডিউল নিয়ে আমিও এই সমস্যার মুখোমুখি হয়েছি

আমি সমস্যাটি সমাধান করতে যা পেয়েছিলাম তা আমদানি করছিল:

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)কেভিনের পরামর্শ অনুসারে অন্তর্ভুক্ত করেছেন, আপনি এখন দেখতে পাবেন যে স্ক্রিপ্টটি পাইথন 3 দ্বারা ব্যাখ্যা করা হচ্ছে


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

এই সমস্যাগুলি ঠিক করার দুটি উপায় রয়েছে,

  • 1 ম কোড পরিবর্তন ছাড়াই সহজ যা
    আপনার স্ক্রিপ্টটি পাইথন 3 দ্বারা চালিত হয়,
    আপনি যদি এখনও পাইথন 2 এ চালাতে চান তবে আপনার পাইথন স্ক্রিপ্টটি চালানোর পরে আপনি যখন ইনপুটটি প্রবেশ করছেন তখন মনে রাখবেন

    1. যদি আপনি প্রবেশ করতে চান stringতবে কেবল "ইনপুট ডাবল-কোটের সাথে যায়" দিয়ে টাইপ করতে শুরু করুন এবং এটি পাইথন 2.7 এ কাজ করবে এবং
    2. আপনি যদি চরিত্র প্রবেশ করতে চান তবে একক উদ্ধৃতি দিয়ে ইনপুটটি ব্যবহার করুন যেমন 'আপনার ইনপুটটি এখানে যায়'
    3. আপনি যদি সংখ্যাটি কোনও সমস্যা না দিয়ে প্রবেশ করতে চান তবে আপনি কেবল সংখ্যাটি টাইপ করুন
  • ২ য় উপায় হ'ল কোড পরিবর্তনগুলি
    নীচে আমদানি ব্যবহার করে পাইথনের কোনও সংস্করণ দিয়ে চালান

    1. from six.moves import input
    2. কোনও আমদানি সহ আপনার কোডটিতে raw_input()ফাংশনের পরিবর্তে ফাংশন ব্যবহার করুনinput()
    3. আপনার কোডটি str()যেমন ফাংশন দিয়ে স্যানিটাইজ করুন str(input())এবং তারপরে কোনও ভেরিয়েবলকে বরাদ্দ করুন

ত্রুটিটি বোঝায় :
'ডুড' নামটি সংজ্ঞায়িত করা হয়নি, অর্থাত পাইথনের জন্য 'ডুড' এখানে পরিবর্তনশীল হয়ে ওঠে এবং অজগর সংজ্ঞায়িত ধরণের কোনও মূল্য থাকে
না তবে কেবল তার বাচ্চার মতো কাঁদে তাই যদি আমরা একটি 'ডিউড' ভেরিয়েবল সংজ্ঞায়িত করি এবং কোনও মান নির্ধারণ করি এবং এটিতে প্রবেশ করুন, এটি কাজ করবে তবে এটি আমরা চাই না কারণ আমরা জানি না ব্যবহারকারী কী প্রবেশ করবে এবং তদুপরি আমরা ব্যবহারকারীর ইনপুট ক্যাপচার করতে চাই।

এই পদ্ধতি সম্পর্কে ফ্যাক্ট:
input() ফাংশন: এই ফাংশনটি আপনি যে ইনপুটটি প্রবেশ করেন সেটির মান পরিবর্তন না করে যেমন এটি প্রবেশ করে তার মান এবং প্রকার নেয়।
raw_input() ফাংশন: এই ফাংশনটি আপনার প্রদত্ত ইনপুটটিকে স্ট্রিং স্ট্রিংয়ে স্পষ্টভাবে রূপান্তর করে,

দ্রষ্টব্য:
ইনপুট () পদ্ধতির দুর্বলতা এই সত্যের মধ্যে রয়েছে যে ইনপুটটির মান অ্যাক্সেস করে চলকটি কেবল পরিবর্তনশীল বা পদ্ধতির নাম ব্যবহার করে যে কেউ অ্যাক্সেস করতে পারে।


0

আপনি নিজের আইডিই দিয়ে কোন অজগরটি ব্যবহার করছেন তা আপনি পরিবর্তন করতে পারেন, যদি আপনি ইতিমধ্যে পাইথন ৩.x ডাউনলোড করে ফেলেছেন তবে এটি স্যুইচ করা খুব বেশি কঠিন হওয়া উচিত নয়। তবে আপনার স্ক্রিপ্টটি অজগর 3.x এ সূক্ষ্মভাবে কাজ করে, আমি কেবল পরিবর্তন করব

print ("your name is" + input_variable)

প্রতি

print ("your name is", input_variable)

কারণ কমা দিয়ে এটি মাঝখানে একটি সাদা জায়গা দিয়ে মুদ্রণ করে your name is স্থানের এবং ব্যবহারকারী যা কিছু দেয় তার । এবং: আপনি যদি raw_inputইনপুট পরিবর্তে কেবল 2.7 ব্যবহার করেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.