TL; DR
input
funkcja w Pythonie 2.7, ocenia każde wejście, jako wyrażenie Python. Jeśli chcesz po prostu odczytywać ciągi, użyj raw_input
funkcji w Pythonie 2.7, która nie oceni ciągów odczytywanych.
Jeśli używasz języka Python 3.x, raw_input
jego 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.stdin
i zwraca ją z usuniętym końcowym znakiem nowej linii. Zwiększa się, EOFError
jeś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, input
a 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'
input
akceptuje ciąg od użytkownika i ocenia ciąg w bieżącym kontekście Pythona. Kiedy piszę dude
jako dane wejściowe, okazuje się, że dude
jest on związany z wartością, thefourtheye
więc wynik oceny staje się thefourtheye
i 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ś os
moduł 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/hosts
plik zostanie usunięty. Widzisz, jak niebezpieczne może być?
Aby to zademonstrować, spróbujmy input
ponownie 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_input
mieć 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 int
funkcji 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
.
input
się zachowywać w ten sposób, ale tylko w wersji 2.7. Co to znaczy, gdy uruchamiaszpython --version
z wiersza polecenia? Alternatywnie, co jeśli napiszeszimport sys; print(sys.version)
na początku skryptu?