web-dev-qa-db-fra.com

Python qui s'exécute dans Windows génère une erreur "<string>" dans Ubuntu

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
3
beginner

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:

  1. 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.

  2. 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é.

4
Eliah Kagan

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
1
Raffa