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

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'erreur modifier

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 monModule modifier

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

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

Si les imports sont fait avec *, les spécifier.

sre_constants.error: bad character range modifier

Arrive quand on inverse les paramètres dans re.compile(paramètre1).search(paramètre2).

sre_constants.error: multiple repeat modifier

Dans un regex, il y a des symboles de répétition consécutifs tels que **, +* ou ++.

sre_constants.error: unmatched group modifier

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 callable modifier

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

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 unequal modifier

L'encodage ou le typage faible pose problème.

ValueError: too many values to unpack modifier

Un "for" est mal utilisé, par exemple retirer "clé" dans : "for clé, valeur in tableau".