Python Language Pièges communs


Exemple

Ne pas charger un fichier

La première erreur possible échoue lors du chargement de la bibliothèque. Dans ce cas, une erreur OSE est généralement déclenchée.

C'est soit parce que le fichier n'existe pas (ou ne peut pas être trouvé par le système d'exploitation):

>>> cdll.LoadLibrary("foobar.so")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ctypes/__init__.py", line 425, in LoadLibrary
    return self._dlltype(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: foobar.so: cannot open shared object file: No such file or directory

Comme vous pouvez le voir, l'erreur est claire et assez indicative.

La deuxième raison est que le fichier est trouvé mais n’a pas le bon format.

>>> cdll.LoadLibrary("libc.so")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ctypes/__init__.py", line 425, in LoadLibrary
    return self._dlltype(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/i386-linux-gnu/libc.so: invalid ELF header

Dans ce cas, le fichier est un fichier script et non un fichier .so . Cela peut également se produire lorsque vous essayez d'ouvrir un fichier .dll sur une machine Linux ou un fichier 64 bits sur un interpréteur Python 32 bits. Comme vous pouvez le voir, dans ce cas, l'erreur est un peu plus vague et nécessite des fouilles.

Ne pas accéder à une fonction

En supposant que nous avons chargé avec succès le fichier .so , nous devons ensuite accéder à notre fonction comme nous l'avons fait sur le premier exemple.

Lorsqu'une fonction non existante est utilisée, un AttributeError est déclenché:

>>> libc.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ctypes/__init__.py", line 360, in __getattr__
    func = self.__getitem__(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 365, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /lib/i386-linux-gnu/libc.so.6: undefined symbol: foo