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
modifierAjouter l'encodage sous le shebang : # coding: utf-8
.
Le regex ajoute le symbole � à la place des pipes (|)
modifierEncoder 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()
modifierDans 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
modifierImportError: bad magic number in...
modifierSi 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
modifierIl 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
modifierAjouter 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
modifierSi les imports sont fait avec *, les spécifier.
sre_constants.error: bad character range
modifierArrive quand on inverse les paramètres dans re.compile(paramètre1).search(paramètre2)
.
sre_constants.error: multiple repeat
modifierDans un regex, il y a des symboles de répétition consécutifs tels que **, +* ou ++.
sre_constants.error: unmatched group
modifierSurvient 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)
modifierUne méthode de classe doit être déclarée avec l'argument "self" à minima.
TypeError: 'module' object is not callable
modifierIl suffit d'appeler le module sous la forme : NomFichier.NomFonction.
TypeError: slice indices must be integers or None or have an __index__ method
modifierUne 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)
modifierEn 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>
modifierVoir l'erreur précédente.
UnicodeWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
modifierL'encodage ou le typage faible pose problème.
ValueError: too many values to unpack
modifierUn "for" est mal utilisé, par exemple retirer "clé" dans : "for clé, valeur in tableau".