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 string
  • x.__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".