Introduction au module sys de Python 3

module-sys-python

Les modules sys et os constituent le cœur de la plupart des outils système de Python. Pour voir comment, nous allons faire un tour rapide et interactif à travers certains méthodes de ces deux modules (dans cet article et les prochains articles) avant de les appliquer dans de plus grands exemples.

Nous allons commencer par le module sys, le plus petit des deux; rappelez-vous que pour voir une liste complète de tous les attributs dans le module sys, vous devez le passer en tant qu’argument à la fonction dir.

Plateformes et versions

Comme la plupart des modules, sys comprend à la fois des sous-modules, attributs et fonctions. Par exemple, ses attributs nous donnent le nom du système d’exploitation sous-jacent sur lequel s’exécute votre programme Python, le plus grand entier possible sur cette machine (bien que les entiers puissent être arbitrairement longs dans Python 3.X), et la version de l’interpréteur Python exécutant notre code.

>>> import sys

>>> sys.platform, sys.maxsize, sys.version
('win32', 2147483647, '3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)]')

>>>

>>> if sys.platform[:3] == 'win': print('hello windows')
...
hello windows

>>>

Si vous avez du code qui doit agir différemment sur différentes machines, il suffit de tester la chaîne sys.platform comme cela est fait ci-dessus; Bien que la plupart des outils Python soit multi-plateforme, les outils non-portatifs sont généralement intégrés dans des tests comme celui-ci.

Par exemple, nous verrons plus tard que certains outils de lancement de programmes et d’interaction de consoles de bas niveau peuvent varier selon la plateforme. Il suffit de tester sys.platform pour choisir le bon outil qui fonctionne sur la machine sur laquelle tourne votre script.

Les chemins de recherche des modules

Le module sys nous permet également d’inspecter le chemin de recherche des modules importés dans un script Python à la fois interactivement et dans un programme Python. L’attribut sys.path mémorise une liste de chemins de répertoires. Lorsqu’un module est importé, Python analyse cette liste de gauche à droite, en recherchant le fichier du module dans chaque répertoire nommé dans la liste.

>>> sys.path
['', 'c:\\program files (x86)\\python 3\\python36.zip', 'c:\\program files (x86)\\python 3\\DLLs', 'c:\\program files (x86)\\python 3\\lib', 'c:\\program files (x86)\\python 3', 'c:\\program files (x86)\\python 3\\lib\\site-packages']

>>>

La liste sys.path est simplement initialisée à partir du paramètre PYTHONPATH (le contenu de tous les fichiers .pth situés dans les répertoires Python de votre machine plus les valeurs par défaut de votre système d’exploitation) lorsque l’interpréteur est démarré pour la première fois.

En fait, si vous inspectez interactivement sys.path, vous remarquerez un certain nombre de répertoires qui ne sont pas sur votre PYTHONPATH: sys.path inclut également un indicateur pour le répertoire de base du script (une chaîne vide) et un ensemble de répertoires de bibliothèque standard pouvant varier selon l’installation.

La valeur de sys.path peut être modifié par un programme. Un script Python peut utiliser des méthodes de la classe list telles que append, extend, insert, pop et remove, ainsi que l’instruction del pour configurer le chemin de recherche au moment de l’exécution afin d’inclure tous les répertoires source auxquels il a besoin d’accéder.

Python utilise toujours le paramètre sys.path actuel pour importer des modules, peu importe les modifications que vous l’avez apporter.

>>> sys.path.append(r'C:\mydir')

>>> sys.path
['', 'c:\\program files (x86)\\python 3\\python36.zip', 'c:\\program files (x86)\\python 3\\DLLs', 'c:\\program files (x86)\\python 3\\lib', 'c:\\program files (x86)\\python 3', 'c:\\program files (x86)\\python 3\\lib\\site-packages', 'C:\\mydir'] <--- mydir a été ajouté

>>>

Modifier directement sys.path comme ceci est une alternative à la définition de votre variable shell PYTHONPATH, mais pas le changement n’est pas permanent. En effet, les modifications apportées à sys.path sont conservées uniquement jusqu’à la fin du processus Python courant, et elles doivent être refaites chaque fois que vous démarrez un nouveau programme ou une nouvelle session Python.

Cependant, certains types de programmes (par exemple, les scripts qui s’exécutent sur un serveur Web) peuvent ne pas pouvoir dépendre des paramètres PYTHONPATH; ces scripts peuvent à la place configurer sys.path au démarrage pour inclure tous les répertoires dont ils auront besoin pour importer des modules.

Le tableau des modules chargés

L’objet sys.modules est un dictionnaire dont les éléments possèdent la forme “module: information” pour chaque module importé dans votre interpréteur ou programme Python (en fait, dans le processus Python appelant).

>>> sys.modules
{'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '
_frozen_importlib': <module 'importlib._bootstrap' (frozen)>, '_imp': <module '_ imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_thread': , '_weakref': ......... beaucoup de texte supprimé..........

>>>

>>> list(sys.modules.keys())
['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakr
ef', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'zipimport'
, 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_si
gnal', '__main__', 'encodings.latin_1', ......... beaucoup de texte supprimé..........

>>>

>>> sys
<module 'sys' (built-in)>

>>> sys.modules['sys']
<module 'sys' (built-in)>

 

Nous pourrions utiliser un tel attribut pour écrire des programmes qui affichent ou traitent tous les modules chargés par un programme (il suffit d’itérer sur les clés (noms des modules) de sys.modules).

Plus de détails sur les exceptions

Les autres attributs du module sys nous permettent de récupérer toutes les informations relatives à l’exception Python la plus récente. C’est pratique si nous voulons traiter les exceptions de manière plus générique. Par exemple, la fonction sys.exc_info renvoie un tuple avec le type, la valeur et l’objet traceback de la dernière exception.

>>> try:
 raise IndexError
except:
 print(sys.exc_info())
...

(<class 'IndexError'>, IndexError(), )

>>>

Nous pourrions utiliser ces informations pour formater notre propre message d’erreur à afficher dans une fenêtre d’interface graphique ou une page Web HTML (rappelons que par défaut, les exceptions non interceptées terminent les programmes avec un affichage d’erreur Python).

Les deux premiers éléments retournés par cet appel ont des affichages de chaîne raisonnables lorsqu’ils sont imprimés directement, et le troisième est un objet de traceback qui peut être traité avec le module standard traceback.

>>> import traceback, sys
def erreur(x):
   raise TypeError('Une erreur simple')

try:
   erreur('bla bla')
except:
   exc_info = sys.exc_info()
   print(exc_info[0])
   print(exc_info[1])
   traceback.print_tb(exc_info[2])
...


<class 'TypeError'>
Une erreur simple
   File "", line 2, in
   File "", line 2, in erreur

>>>

Le module traceback peut également formater des messages sous forme de chaînes de caractères et les acheminer vers des objets fichier spécifiques.

Autres outils du module sys

Le module sys exporte des outils supplémentaires couramment. Par exemple:

  • Les arguments de ligne de commande s’affichent sous la forme d’une liste de chaînes appelée sys.argv.
  • Les flux standard sont disponibles sous les noms sys.stdin, sys.stdout et sys.stderr.
  • L’arrêt d’un programme peut être forcé avec les appels sys.exit.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here