input () error - NameError: nazwa „…” nie jest zdefiniowana

220

Podczas próby uruchomienia tego prostego skryptu pojawia się błąd:

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

Powiedzmy, że wpisuję „koleś”, błąd, który otrzymuję to:

line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined

Używam tych skryptów w Pythonie 2.7.

chillpenguin
źródło
12
Czy na pewno jest to Python 3.3? Spodziewałbym inputsię zachowywać w ten sposób, ale tylko w wersji 2.7. Co to znaczy, gdy uruchamiasz python --versionz wiersza polecenia? Alternatywnie, co jeśli napiszesz import sys; print(sys.version)na początku skryptu?
Kevin
1
Nie korzystasz z Python 3. Jakoś korzystasz z Python 2 (nie znam tej aplikacji „Python Launcher”)
Wooble,
1
Wpisz jako pierwszy import sysi drugi wiersz print(sys.version_info), aby sprawdzić, której wersji używasz.
Hyperboreus
1
Zrobiłem to, co powiedział Kevin i jest to wersja 2.7.5! Nie jestem jednak pewien jak. Pobrałem i zainstalowałem wersję 3.3, w folderze aplikacji znajduje się folder o nazwie „Python 3.3”. W tym folderze znajduje się aplikacja o nazwie „Python Launcher” i uruchamiam skrypty, przeciągając je i upuszczając w aplikacji Python Launcher . Dlaczego nadal używam wersji 2.7, gdy korzystam z aplikacji uruchamiającej 3.3?
chillpenguin
2
@chillpenguin: sprawdź okno dialogowe Preferencji dla Python Launcher. Najwyraźniej nie jest domyślnie działająca wersja, w której został zainstalowany, co jest ... głupie. (Nigdy nie korzystałem z niego sam; uważam, że korzystanie z terminalu jest lepsze ...)
Wooble,

Odpowiedzi:

265

TL; DR

inputfunkcja w Pythonie 2.7, ocenia każde wejście, jako wyrażenie Python. Jeśli chcesz po prostu odczytywać ciągi, użyj raw_inputfunkcji w Pythonie 2.7, która nie oceni ciągów odczytywanych.

Jeśli używasz języka Python 3.x, raw_inputjego nazwa została zmieniona na input. Cytując uwagi do wydania Python 3.0 ,

raw_input()został przemianowany na input(). Oznacza to, że nowa input()funkcja odczytuje linię z sys.stdini zwraca ją z usuniętym końcowym znakiem nowej linii. Zwiększa się, EOFErrorjeśli sygnał wejściowy zostanie przedwcześnie zakończony. Aby uzyskać stare zachowanie input(), użyjeval(input())


W Pythonie 2.7 istnieją dwie funkcje, których można użyć do akceptowania danych wejściowych użytkownika. Jeden jest, inputa drugi jest raw_input. Relację między nimi możesz myśleć w następujący sposób

input = eval(raw_input)

Rozważ następujący fragment kodu, aby lepiej to zrozumieć

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

inputakceptuje ciąg od użytkownika i ocenia ciąg w bieżącym kontekście Pythona. Kiedy piszę dudejako dane wejściowe, okazuje się, że dudejest on związany z wartością, thefourtheyewięc wynik oceny staje się thefourtheyei zostaje przypisany input_variable.

Jeśli wprowadzę coś innego, czego nie ma w bieżącym kontekście Pythona, to się nie powiedzie 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

Zagadnienia bezpieczeństwa związane z Pythonem 2.7 input:

Ponieważ bez względu na to, jaki typ użytkownika jest oceniany, wiąże się to również z problemami bezpieczeństwa. Na przykład, jeśli już załadowałeś osmoduł do swojego programu import os, a następnie użytkownik wpisze

os.remove("/etc/hosts")

zostanie to ocenione przez Pythona jako wyrażenie wywołania funkcji i zostanie wykonane. Jeśli wykonujesz Python z podwyższonymi uprawnieniami, /etc/hostsplik zostanie usunięty. Widzisz, jak niebezpieczne może być?

Aby to zademonstrować, spróbujmy inputponownie uruchomić funkcję.

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

Teraz, gdy input("Enter your name: ")jest wykonywany, czeka na dane wejściowe użytkownika, a dane wejściowe użytkownika są prawidłowym wywołaniem funkcji języka Python, a więc również jest wywoływane. Dlatego widzimy Enter your name again:ponownie monit.

Lepiej jest więc raw_inputmieć taką funkcję

input_variable = raw_input("Enter your name: ")

Jeśli chcesz przekonwertować wynik na inny typ, możesz użyć odpowiednich funkcji do konwersji zwróconego ciągu raw_input. Na przykład, aby odczytać dane wejściowe jako liczby całkowite, użyj intfunkcji pokazanej w tej odpowiedzi .

W Pythonie 3.x jest tylko jedna funkcja do pobierania danych wejściowych od użytkownika i jest ona wywoływana input, co jest równoważne z Pythonem 2.7 raw_input.

thefourtheye
źródło
56

Używasz Python 2, a nie Python 3. Aby to zadziałało w Python 2, użyj raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
dawidyzm
źródło
17

Ponieważ piszesz w języku Python 3.x, zacznij swój skrypt od:

#!/usr/bin/env python3

Jeśli użyjesz:

#!/usr/bin/env python

Domyślnie ustawiony jest na Python 2.x. Przechodzą one do pierwszego wiersza skryptu, jeśli nie ma nic, co zaczyna się od #! (aka shebang).

Jeśli twoje skrypty zaczynają się od:

#! python

Następnie możesz go zmienić na:

#! python3

Chociaż to krótsze formatowanie jest rozpoznawane tylko przez kilka programów, takich jak program uruchamiający, więc nie jest to najlepszy wybór.

Pierwsze dwa przykłady są znacznie szerzej stosowane i pomogą zapewnić, że kod będzie działał na każdym komputerze, na którym jest zainstalowany Python.

Zim
źródło
6

Powinieneś użyć, raw_inputponieważ używasz Python-2.7. Kiedy użyjesz input()zmiennej (na przykład s = input('Name: '):), wykona ona komendę w środowisku Python bez zapisywania tego, co napisałeś na zmiennej ( s) i spowoduje błąd, jeśli to, co napisałeś, nie jest zdefiniowane.

raw_input()zapisze poprawnie to, co napisałeś na temat zmiennej (na przykład f = raw_input('Name : '):), i nie wykona jej w środowisku Python bez stworzenia ewentualnego błędu:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
Skiller Dz
źródło
5

Dla Pythona 3 i nowszych

s = raw_input()

rozwiąże problem na pycharm IDE, jeśli rozwiązujesz na stronie internetowej dokładnie hackerrank, a następnie użyj:

s = input()
RAHUL KUMAR
źródło
4

Możesz albo:

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

lub:

x = str(input("enter your name"))
print "your name is %s" % x
Abdullah Baraka
źródło
1
raw_input naprawiło dla mnie problem
Spencer Goff
Ale raw_input () nie jest dostępne w Pythonie 3.
Kartusy
4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Musisz wprowadzić dane wejściowe w postaci pojedynczych lub podwójnych cudzysłowów

Ex:'dude' -> correct

    dude -> not correct
Parminder Singh
źródło
4

Napotkałem również ten problem z modułem, który miał być kompatybilny z Pythonem 2.7 i 3.7

co znalazłem, aby rozwiązać problem, to importowanie:

from six.moves import input

to poprawiło użyteczność dla obu tłumaczy

możesz przeczytać więcej o sześciu bibliotekach tutaj

Elad L.
źródło
3

Używamy następujących, które działają zarówno w Pythonie 2, jak i w Pythonie 3

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
Hardian
źródło
2

Dla każdego, kto może napotkać ten problem, okazuje się, że nawet jeśli go uwzględnisz #!/usr/bin/env python3 na początku skryptu, shebang jest ignorowany, jeśli plik nie jest wykonywalny.

Aby ustalić, czy plik jest wykonywalny:

  • uruchom ./filename.pyz wiersza poleceń
  • jeśli dostaniesz -bash: ./filename.py: Permission denied, biegnijchmod a+x filename.py
  • biegnij ./filename.pyjeszcze raz

Jeśli podałeś, import sys; print(sys.version)jak sugerował Kevin, zobaczysz, że skrypt jest interpretowany przez python3

automatyczny
źródło
2

Dobry wkład poprzednich.

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: "))
Wpisz swoje imię: Joe
(„Cześć”, „Joe”, <typ „str”>)
Cześć Joe, pa 

Twoje imię: Joe
Joe

Dzięki!

Joe Llerena
źródło
1

Istnieją dwa sposoby rozwiązania tych problemów:

  • 1st jest prosty bez zmiany kodu, który
    uruchamia skrypt w Python3,
    jeśli nadal chcesz uruchomić na python2, to po uruchomieniu skryptu python, podczas wprowadzania danych, pamiętaj

    1. jeśli chcesz wejść, stringpo prostu zacznij pisać w dół z „wejście idzie z podwójnym cudzysłowem” i będzie działać w python2.7 i
    2. jeśli chcesz wpisać znak, użyj danych wejściowych z pojedynczym cudzysłowiem, np. „Twój tekst idzie tutaj”
    3. jeśli chcesz wprowadzić numer, a nie problem, po prostu wpisz numer
  • Drugi sposób polega na zmianach kodu.
    Użyj poniższego importu i uruchom dowolną wersję Pythona

    1. from six.moves import input
    2. Używaj raw_input()funkcji zamiast input()funkcji w kodzie przy każdym imporcie
    3. odkaż swój kod za pomocą str()funkcji podobnej do, str(input())a następnie przypisz do dowolnej zmiennej

Jak sugeruje błąd :
nazwa „koleś” nie jest zdefiniowana, tj. Dla pytona „koleś” staje się tutaj zmienną i nie ma przypisanej żadnej wartości typu zdefiniowanego w pythonie,
więc tylko płacze jak dziecko, więc jeśli zdefiniujemy zmienną „koleś” i przypiszemy dowolną wartość i przejdziemy do niego, będzie działać, ale nie tego chcemy, ponieważ nie wiemy, do którego użytkownika wejdzie, a ponadto chcemy przechwycić dane wejściowe użytkownika.

Fakt o tej metodzie:
input() funkcja: Ta funkcja przyjmuje wartość i typ wprowadzanego wejścia bez zmiany typu.
raw_input() funkcja: ta funkcja jawnie przekształca dane wejściowe w ciąg znaków,

Uwaga:
Luka w metodzie input () polega na tym, że do zmiennej uzyskującej dostęp do wartości danych wejściowych może uzyskać dostęp każdy, używając tylko nazwy zmiennej lub metody.

Naval Kishor Jha
źródło
0

Możesz zmienić python, którego używasz w swoim IDE, jeśli już pobrałeś python 3.x, przełączanie nie powinno być trudne. Ale twój skrypt działa dobrze na Pythonie 3.x, chciałbym tylko zmienić

print ("your name is" + input_variable)

do

print ("your name is", input_variable)

Ponieważ za pomocą przecinka drukuje się z białymi odstępami pomiędzy your name isznakami wprowadzonymi przez użytkownika. ORAZ: jeśli używasz wersji 2.7, po prostu użyj raw_inputzamiast wprowadzania.

Cleve Green
źródło