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 pasModifier
Ajouter l'encodage sous le shebang : # coding: utf-8
.
Le regex ajoute le symbole � à la place des pipes (|)Modifier
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
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'erreurModifier
ImportError: bad magic number in...Modifier
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 monModuleModifier
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 rangeModifier
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 definedModifier
Si les imports sont fait avec *, les spécifier.
sre_constants.error: bad character rangeModifier
Arrive quand on inverse les paramètres dans re.compile(paramètre1).search(paramètre2)
.
sre_constants.error: multiple repeatModifier
Dans un regex, il y a des symboles de répétition consécutifs tels que **, +* ou ++.
sre_constants.error: unmatched groupModifier
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
Une méthode de classe doit être déclarée avec l'argument "self" à minima.
TypeError: 'module' object is not callableModifier
Il suffit d'appeler le module sous la forme : NomFichier.NomFonction.
TypeError: slice indices must be integers or None or have an __index__ methodModifier
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
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
Voir l'erreur précédente.
UnicodeWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequalModifier
L'encodage ou le typage faible pose problème.
ValueError: too many values to unpackModifier
Un "for" est mal utilisé, par exemple retirer "clé" dans : "for clé, valeur in tableau".