Programmation Python/Problèmes connus

Un livre de Wikilivres.

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 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 | 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".