Więcej
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?
192
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 funkcjiraw_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 nainput
. Cytaty z Python 3.0 release notes,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 toraw_input
. Możesz pomyśleć o relacji między nimi w następujący sposóbRozważmy następujący fragment kodu, aby lepiej to zrozumieć
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ę, żedude
jest związany z wartościąthefourtheye
i tak wynik oceny staje sięthefourtheye
i to zostaje przypisane doinput_variable
.Jeśli wpiszę coś innego, czego nie ma w bieżącym kontekście pythona, zakończy się to niepowodzeniem z
NameError
.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 wpisujezostanie 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
.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 ponownieEnter your name again:
prompt again.Tak więc, lepiej jest użyć funkcji
raw_input
, jak poniżejJeś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 funkcjiint
, 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
.Używasz Pythona 2, nie Pythona 3. Aby to działało w Pythonie 2, użyj
raw_input
.Ponieważ piszesz dla Pythona 3.x, będziesz chciał rozpocząć swój skrypt od:
Jeśli używasz:
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:
Wtedy możesz zmienić to na:
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.