J'ai écrit un script Python (work.py) et il fonctionne bien sous Windows, mais lorsque je l'exécute sur Ubuntu, cela me montre une erreur, si j'entre le nom en tant que - chaîne, mais si j'entre le nom sous la forme entier ça va bien.
NameError:
thanapong@thanapong-Lenovo-C360:~/Desktop$ python work.py
Hours: 72
Minutes: 0
Seconds: 0
Enter the name: CHATCHAI
Traceback (most recent call last):
File "work.py", line 9, in <module>
look for = str(input("Enter the name: "))
File "<string>", line 1, in <module>
NameError: name 'CHATCHAI' is not defined
thanapong@thanapong-Lenovo-C360:~/Desktop$ python work.py
Hours: 72
Minutes: 0
Seconds: 0
Enter the name: BILLY
Traceback (most recent call last):
File "work.py", line 9, in <module>
look for = input("Enter the name: ")
File "<string>", line 1, in <module>
NameError: name 'BILLY' is not defined
Avec int ça marche bien:
thanapong@thanapong-Lenovo-C360:~/Desktop$ python work.py
Hours: 72
Minutes: 0
Seconds: 0
Enter the name: 2
3
0
Not found
1
2
3
4
0
Not found
1
2
3
4
0
Not found
1
2
Ceci est mon code.
import pandas as pd
import time
hourz=input('Hours: ')
minz=input('Minutes: ')
secz=input('Seconds: ')
lookfor = input("Enter the name: ")
name = str(lookfor)
x = 5
print(' ')
hour=int(hourz)
min=int(minz)
sec=int(secz)
day = int(((hour*60*60)+(min*60)+(sec))/86400)
print(day)
for b in range(day):
for a in range(x):
time.sleep(1)
print(a)
if a == 0:
data = pd.read_csv("/media/thanapong/F91B-8B18/Customer_List.txt", header=0)
query = data.loc[data['NAME']==name]
if not query.empty:
print(query)
data.loc[data['NAME']==name, 'SCORE'] = (query.SCORE - 1)
print()
print(data.loc[data['NAME']==name])
data.to_csv("/media/thanapong/F91B-8B18/Customer_List.txt", index=None)
else:
print('Not found')
print(' ')
print(' ')
print("End")
C'est un exemple de Customer_List.txt (il a plusieurs lignes).
ID,NAME,LASTNAME,SCORE,TEL,PASS
61070500216,CHATCHAI,KARUNA,22,123456789,12345
61070500217,BIGM,KORATBOY,15,123456789,123456789
Jusqu'à présent, dans Ubuntu, une commande python
fournie par le système est toujours Python 2, jamais Python 3, et pour Python 3 il faut utiliser python3
.
C'est le cas même sur les systèmes qui n'ont pas Python 2 installé mais ont Python 3 installé. Les nouvelles versions d'Ubuntu viennent de cette façon, et il y a un python3
mais pas de commande python
. Vous pouvez installer le métapaquet python
, qui installe Python 2.
Les versions antérieures d'Ubuntu sont livrées avec Python 2 installé et non Python 3. Comme Raffa dit , vous pouvez installer Python 3 sur un tel système via le métapaquet python3
.
Jusqu'à récemment, avoir python
être Python 2 (et non Python 3) avait été la recommandation officielle pour Unix-like) systèmes d'exploitation . Les systèmes GNU/Linux populaires ont adhéré à cette recommandation, à l'exception notable d'Arch Linux et de ses dérivés, sur lesquels python
a longtemps été Python 3 Debian et Ubuntu (qui est un dérivé de Debian), entre autres systèmes, continuent d'utiliser le schéma de dénomination traditionnellement recommandé jusqu'à présent.
D'après mon expérience, les utilisateurs de certains autres systèmes d'exploitation - en particulier Windows - trouvent souvent cela surprenant. Cela peut être particulièrement déroutant pour les novices qui ne connaissent pas bien la distinction entre Python 2 et Python 3.
Ma recommandation est:
Toujours savoir (ou découvrir) lequel des Python 2 ou Python 3 on écrit).
Il est possible d'écrire délibérément du code qui fonctionne comme les deux, mais les gens qui le font savent qu'ils le font, et ce n'est pas quelque chose que la plupart des gens feront lorsqu'ils commenceront.
Pour Python fichiers de code source que vous exécutez (c'est-à-dire les scripts/programmes, plutôt que les modules utilisables uniquement comme bibliothèques), démarrez le fichier avec une ligne Shebang qui spécifie l'interpréteur que vous souhaitez.
Pour Python 3 vous voudrez généralement utiliser #!/usr/bin/env python3
, comme Ray Butterworth a commenté . Pour Python 2, pensez à #!/usr/bin/env python2
. Bien que vous puissiez utiliser #!/usr/bin/env python
dans Ubuntu, l'utilisation de la commande python2
est également prise en charge, rend votre signification claire pour les humains, fonctionne sur plus de systèmes d'exploitation et pourrait fonctionner plus longtemps à l'avenir.
La ligne Shebang n'affecte pas l'interpréteur utilisé si vous exécutez le script en passant son nom comme argument à une commande comme python
(ou python2
) ou python3
. Au lieu de cela, marquez l'exécutable du script pour pouvoir l'exécuter:
chmod +x scriptname
Vous ne devez le faire qu'une seule fois. Ensuite, vous pouvez exécuter le script comme ceci:
./scriptname
Sous Windows, vous pouvez utiliser la commande de lancement py
pour exécuter votre script, qui respecte votre ligne Shebang, sauf si vous la remplacez en spécifiant une version. Autrement dit, si votre script commence par #!/usr/bin/env python2
, l'exécution de py scriptname
dans Windows a le même effet que py -2 scriptname
, et s'il commence par #!/usr/bin/env python3
, l'exécution de py scriptname
dans Windows a le même effet que py -3 scriptname
.
Notez cependant que py
traite python
(sans numéro de version) comme spécifiant Python 3 plutôt que Python 2 . C'est une autre raison d'envisager d'écrire python2
(plutôt que simplement python
) à la fin si vos lignes Shebang même dans Ubuntu; cela rend vos scripts plus portables vers Windows lorsque le py
le lanceur est utilisé.
Quant à savoir pourquoi vous avez ces erreurs lorsque vous avez exécuté par inadvertance votre code Python 3 dans un Python 2 interpréteur: la fonction input
dans Python 3 lit et renvoie simplement une ligne d'entrée, ce que vous voulez, mais la fonction input
dans Python 2 lit une ligne d'entrée, la traite comme = Python code, exécute ce code et renvoie la valeur résultante . Cela a implications de sécurité assez alarmantes lorsqu'il est utilisé sans précaution ( même dans Python 2 programmes ), et c'est aussi juste pas quelque chose que les gens veulent habituellement faire . Si vous aviez besoin d'écrire votre script dans Python 2, vous utiliseriez la fonction raw_input
à la place comme le dit Steeldriver , mais la solution est vraiment de utilisez python3
comme décrit ci-dessus, qui malgré son nom est en fait l'interprète par défaut Python dans Ubunt . Les entrées comme 123
sont Python, mais inp uts comme BILLY
ne le sont pas, sauf si une variable de ce nom a été définie; c'est pourquoi la saisie numérique a fonctionné.
J'ai exécuté votre code et il s'est exécuté correctement. Je n'ai pas pu créer la même erreur que dans votre image. Votre code a accepté une chaîne comme entrée pour le champ de nom. Python version 3.7 et système d'exploitation Ubuntu. Veuillez consulter la sortie ci-dessous:
Hours: 72
Minutes: 0
Seconds: 0
Enter the name: BILLY
3
0
ID NAME LASTNAME SCORE ... KORATBOY 15 123456789.1 123456789.2
0 NaN BILLY NaN NaN ... NaN NaN NaN NaN
[1 rows x 16 columns]
ID NAME LASTNAME SCORE ... KORATBOY 15 123456789.1 123456789.2
0 NaN BILLY NaN NaN ... NaN NaN NaN NaN
[1 rows x 16 columns]
1
2
3
4
0
ID NAME LASTNAME SCORE ... KORATBOY 15 123456789.1 123456789.2
0 NaN BILLY NaN NaN ... NaN NaN NaN NaN
[1 rows x 16 columns]
ID NAME LASTNAME SCORE ... KORATBOY 15 123456789.1 123456789.2
0 NaN BILLY NaN NaN ... NaN NaN NaN NaN
[1 rows x 16 columns]
1
2
3
4
0
ID NAME LASTNAME SCORE ... KORATBOY 15 123456789.1 123456789.2
0 NaN BILLY NaN NaN ... NaN NaN NaN NaN
[1 rows x 16 columns]
ID NAME LASTNAME SCORE ... KORATBOY 15 123456789.1 123456789.2
0 NaN BILLY NaN NaN ... NaN NaN NaN NaN
[1 rows x 16 columns]
1
2
3
4
End
Process finished with exit code 0
Je pense que la solution est que vous devez utiliser python3
à l'invite de commande et PAS python
pour exécuter votre fichier. Votre code est clairement écrit pour python3
Si python3 n'est pas installé sur votre système, vous pouvez l'installer en exécutant la commande suivante dans le terminal:
Sudo apt install python3