Programmation Python/Problèmes connus
Ce chapitre aide à résoudre les problèmes les plus courants, selon la situation ou le message d'erreur rencontré.
Les opérations avec un caractère non-ASCII ne fonctionne pas
[modifier | modifier le wikicode]Ajouter l'encodage sous le shebang : # coding: utf-8
.
Le regex ajoute le symbole � à la place des pipes (|)
[modifier | modifier le wikicode]Encoder la chaine du pipe sous la forme d'une chaîne litérale Unicode :
- Python 2.x :
ur''
. - Python 3.x+ :
r''
.
re.sub() ne trouve pas une expression trouvée par re.search()
[modifier | modifier le wikicode]Dans un contexte multi-ligne, re.sub() ne recherche pas tout comme re.search() (qui a un global flag).
Utiliser ma_sous_chaine[re.search(regex, ma_chaine).start():re.search(regex, ma_chaine).end()]
.
Messages d'erreur
[modifier | modifier le wikicode]ImportError: bad magic number in...
[modifier | modifier le wikicode]Si vous avez les fichiers sources correspondants, forcez une nouvelle compilation des fichiers sources en supprimant les fichiers compilés :
Linux / MacOS X | rm *.pyc
|
Windows | del *.pyc
|
Sinon, essayez d'obtenir les fichiers sources, ou utilisez la version de Python utilisée par ces fichiers.
Import error: No module named monModule
[modifier | modifier le wikicode]Il suffit de modifier le PYTHONPATH pour qu'il trouve le module mentionné, par exemple derrière une condition s'assurant que la machine qui exécute le script contient le répertoire du module :
import sys, socket
if socket.gethostname() == "MonUbuntu":
sys.path.append(u'/usr/local/lib/python2.7/dist-packages/requests')
else:
import requests
Dans le cas des tests unitaires, il faut en faire un package : créer __init__.py dans le dossier des tests pour qu'il importe le dossier du code à tester.
IndexError: list index out of range
[modifier | modifier le wikicode]Ajouter un test sur la taille du tableau avant d'y accéder, ex :
if len(tableau) > 0: print tableau[0]
NameError: global name 'ma_fonction' is not defined
[modifier | modifier le wikicode]Si les imports sont fait avec *, les spécifier.
sre_constants.error: bad character range
[modifier | modifier le wikicode]Arrive quand on inverse les paramètres dans re.compile(paramètre1).search(paramètre2)
.
sre_constants.error: multiple repeat
[modifier | modifier le wikicode]Dans un regex, il y a des symboles de répétition consécutifs tels que **, +* ou ++.
sre_constants.error: unmatched group
[modifier | modifier le wikicode]Survient quand re.sub()
ne trouve pas un groupe de capture. On peut donc le rechercher pour lancer le remplacement si la condition est remplie :
#!/usr/bin/env python
if re.compile(chaine).search(regex):
re.sub(regex, chaine)
Sinon il y a peut-être une barre verticale non échappée à tort.
TypeError: maMethode() takes no arguments (1 given)
[modifier | modifier le wikicode]Une méthode de classe doit être déclarée avec l'argument "self" à minima.
TypeError: 'module' object is not callable
[modifier | modifier le wikicode]Il suffit d'appeler le module sous la forme : NomFichier.NomFonction.
TypeError: slice indices must be integers or None or have an __index__ method
[modifier | modifier le wikicode]Une chaine est divisée par une variable inappropriée (ex : x dans c[x:y]).
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position x: ordinal not in range(128)
[modifier | modifier le wikicode]En Python 2.7 sur Pywikibot, convertir la variable avec .encode(config.console_encoding, 'replace')
(passe partout en remplaçant les caractères inconnus par des ? en console).
Sinon, ne pas utiliser str(x)
, par exemple au profit de :
.encode('utf-8')
pour une stringx.__getattr__('name').encode('utf-8')
pour une classe.
Dans le cas de l'affichage du résultat d'une concaténation, la séparer en deux instructions.
Sinon, ajouter .encode('utf-8')
après la variable résultat de la concaténation.
UnicodeEncodeError: 'charmap' codec can't encode characters in position x-y: character maps to <undefined>
[modifier | modifier le wikicode]Voir l'erreur précédente.
UnicodeWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
[modifier | modifier le wikicode]L'encodage ou le typage faible pose problème.
ValueError: too many values to unpack
[modifier | modifier le wikicode]Un "for" est mal utilisé, par exemple retirer "clé" dans : "for clé, valeur in tableau".