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 nainput()
. Oznacza to, że nowa funkcjainput()
czyta linię zsys.stdin
i zwraca ją z usuniętą końcową nową linią. Podnosi onaEOFError
jeśli wejście jest zakończone przedwcześnie. Aby uzyskać stare zachowanieinput()
, użyjeval(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 <module>
File "<string>", line 1, in <module>
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
.
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)
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.