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.
python
python-2.7
input
nameerror
chillpenguin
źródło
źródło
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?import sys
i drugi wierszprint(sys.version_info)
, aby sprawdzić, której wersji używasz.Odpowiedzi:
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żyjraw_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 nainput
. Cytując uwagi do wydania Python 3.0 ,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 jestraw_input
. Relację między nimi możesz myśleć w następujący sposóbRozważ następujący fragment kodu, aby lepiej to zrozumieć
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ę, żedude
jest on związany z wartością,thefourtheye
więc wynik oceny staje sięthefourtheye
i zostaje przypisanyinput_variable
.Jeśli wprowadzę coś innego, czego nie ma w bieżącym kontekście Pythona, to się nie powiedzie
NameError
.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 programuimport os
, a następnie użytkownik wpiszezostanie 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ę.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 widzimyEnter your name again:
ponownie monit.Lepiej jest więc
raw_input
mieć taką funkcję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żyjint
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.7raw_input
.źródło
Używasz Python 2, a nie Python 3. Aby to zadziałało w Python 2, użyj
raw_input
.źródło
Ponieważ piszesz w języku Python 3.x, zacznij swój skrypt od:
Jeśli użyjesz:
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:
Następnie możesz go zmienić na:
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.
źródło
Powinieneś użyć,
raw_input
ponieważ używasz Python-2.7. Kiedy użyjeszinput()
zmiennej (na przykłads = 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ładf = raw_input('Name : ')
:), i nie wykona jej w środowisku Python bez stworzenia ewentualnego błędu:źródło
Dla Pythona 3 i nowszych
rozwiąże problem na pycharm IDE, jeśli rozwiązujesz na stronie internetowej dokładnie hackerrank, a następnie użyj:
źródło
Możesz albo:
lub:
źródło
Musisz wprowadzić dane wejściowe w postaci pojedynczych lub podwójnych cudzysłowów
źródło
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:
to poprawiło użyteczność dla obu tłumaczy
możesz przeczytać więcej o sześciu bibliotekach tutaj
źródło
Używamy następujących, które działają zarówno w Pythonie 2, jak i w Pythonie 3
źródło
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:
./filename.py
z wiersza poleceń-bash: ./filename.py: Permission denied
, biegnijchmod a+x filename.py
./filename.py
jeszcze razJeśli podałeś,
import sys; print(sys.version)
jak sugerował Kevin, zobaczysz, że skrypt jest interpretowany przez python3źródło
Dobry wkład poprzednich.
Dzięki!
źródło
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
string
po prostu zacznij pisać w dół z „wejście idzie z podwójnym cudzysłowem” i będzie działać w python2.7 iDrugi sposób polega na zmianach kodu.
Użyj poniższego importu i uruchom dowolną wersję Pythona
from six.moves import input
raw_input()
funkcji zamiastinput()
funkcji w kodzie przy każdym imporciestr()
funkcji podobnej do,str(input())
a następnie przypisz do dowolnej zmiennejJak 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.
źródło
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ć
do
Ponieważ za pomocą przecinka drukuje się z białymi odstępami pomiędzy
your name is
znakami wprowadzonymi przez użytkownika. ORAZ: jeśli używasz wersji 2.7, po prostu użyjraw_input
zamiast wprowadzania.źródło