input() error - NameError: name '...' is not defined

Otrzymuję błąd, gdy próbuję uruchomić ten prosty skrypt pythona:

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

Powiedzmy, że wpisuję "dude", błąd, który dostaję to:

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

Pracuję na Mac OS X 10.9.1 i używam aplikacji Python Launcher, która została dołączona do instalacji Pythona 3.3, aby uruchomić skrypt.

Edycja: Zdałem sobie sprawę, że w jakiś sposób uruchamiam te skrypty z 2.7. Zgaduję, że prawdziwym pytaniem jest, jak mogę uruchomić moje skrypty z wersją 3.3? Myślałem, że jeśli przeciągnę i upuszczę moje skrypty na wierzch aplikacji Python Launcher, która jest wewnątrz folderu Python 3.3 w moim folderze aplikacji, że uruchomi moje skrypty przy użyciu 3.3. Domyślam się, że ta metoda nadal uruchamia skrypty z 2.7. Więc jak mogę używać 3.3?

TL;DR

Funkcja input w Pythonie 2.7, ocenia cokolwiek wpiszesz, jako wyrażenie Pythona. Jeśli chcesz po prostu czytać ciągi znaków, użyj funkcji raw_input w Pythonie 2.7, która nie będzie oceniać czytanych ciągów znaków.

Jeśli używasz Pythona 3.x, raw_input zostało przemianowane na input. Cytaty z Python 3.0 release notes,

raw_input() zostało przemianowane na input(). Oznacza to, że nowa funkcja input() czyta linię z sys.stdin i zwraca ją z usuniętą końcową nową linią. Podnosi ona EOFError jeśli wejście jest zakończone przedwcześnie. Aby uzyskać stare zachowanie input(), użyj eval(input()).


W Pythonie 2.7, istnieją dwie funkcje, które mogą być użyte do akceptowania danych wejściowych użytkownika. Jedna z nich to input, a druga to raw_input. Możesz pomyśleć o relacji między nimi w następujący sposób

input = eval(raw_input)

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

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

input przyjmuje ciąg znaków od użytkownika i analizuje go w bieżącym kontekście Pythona. Kiedy wpiszę dude jako wejście, okaże się, że dude jest związany z wartością thefourtheye i tak wynik oceny staje się thefourtheye i to zostaje przypisane do input_variable.

Jeśli wpiszę coś innego, czego nie ma w bieżącym kontekście pythona, zakończy się to niepowodzeniem z NameError.

>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
  File "<input>", line 1, in 
  File "", line 1, in 
NameError: name 'dummy' is not defined

Uwagi dotyczące bezpieczeństwa z Pythonem 2.7's input:

Ponieważ cokolwiek wpisuje użytkownik jest analizowane, nakłada to również problemy bezpieczeństwa. Na przykład, jeśli już załadowałeś moduł os do swojego programu za pomocą import os, a następnie użytkownik wpisuje

os.remove("/etc/hosts")

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

Aby to zademonstrować, spróbujmy ponownie wykonać funkcję input.

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

Teraz, gdy funkcja input("Podaj swoje imię: ") jest wykonywana, czeka ona na dane wejściowe użytkownika, a dane wejściowe użytkownika są poprawnym wywołaniem funkcji Pythona, a więc są również wywoływane. Dlatego właśnie widzimy ponownie Enter your name again: prompt again.

Tak więc, lepiej jest użyć funkcji raw_input, jak poniżej

input_variable = raw_input("Enter your name: ")

Jeśli potrzebujesz przekonwertować wynik na jakiś inny typ, wtedy możesz użyć odpowiednich funkcji do konwersji łańcucha zwracanego przez raw_input. Na przykład, aby odczytać dane wejściowe jako liczby całkowite, użyj funkcji int, jak pokazano w this answer.

W pythonie 3.x jest tylko jedna funkcja do pobierania danych wejściowych od użytkownika i nazywa się ona input, co jest odpowiednikiem Pythona 2.7' raw_input.

Komentarze (0)

Używasz Pythona 2, nie Pythona 3. Aby to działało w Pythonie 2, użyj raw_input.

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

Ponieważ piszesz dla Pythona 3.x, będziesz chciał rozpocząć swój skrypt od:

#!/usr/bin/env python3

Jeśli używasz:

#!/usr/bin/env python

Domyślnie będzie to Python 2.x. Są one umieszczane w pierwszej linii skryptu, jeśli nie ma nic, co zaczyna się od #! (aka shebang).

Jeśli twoje skrypty zaczynają się tylko od:

#! python

Wtedy możesz zmienić to na:

#! python3

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

Dwa pierwsze przykłady są znacznie powszechniej używane i pomogą zapewnić, że Twój kod będzie działał na każdej maszynie z zainstalowanym Pythonem.

Komentarze (0)