Introduction au module OS du langage Python 3

Module-OS-Python

Comme mentionné, le module os est le plus grand des deux modules système de base du langage Python. Il contient tous les appels système habituels que vous utilisez dans les programmes C et les scripts Shell. Ses appels traitent les répertoires, les processus, les variables Shell, etc. Techniquement, ce module fournit des outils POSIX- une norme portable pour les appels système, ainsi que des outils de traitement d’annuaire indépendants de la plate-forme, comme le module imbriqué os.path.

Sur le plan opérationnel, os sert d’interface largement portable aux appels système: les scripts écrits avec os et os.path peuvent généralement être exécutés sans modification sur n’importe quelle plate-forme. Sur certaines plateformes, os inclut des outils supplémentaires disponibles uniquement pour cette plate-forme (par exemple, des appels de processus de bas niveau sous Unix); dans l’ensemble, cependant, il est aussi polyvalent que techniquement possible.

Quelques outils du module os

Jetons un coup d’œil aux interfaces de base dans le module os. Le tableau ci-dessous résume certains outils les plus couramment utilisés dans le module os, organisés par domaine fonctionnel.

TâcheOutils
Variables Shellos.environ
Exécution de programmesos.system, os.popen, os.execv, os.spawnv
Gestion des processusos.fork, os.pipe, os.waitpid, os.kill
Fichiers/verrous de descripteuros.open, os.read, os.write
Gestion du système de fichiersos.remove, os.rename, os.mkfifo, os.mkdir, os.rmdir
Outils d’administrationos.getcwd, os.chdir, os.chmod, os.getpid, os.listdir, os.access
Outils de portabilitéos.sep, os.pathsep, os.curdir, os.path.split, os.path.join
Gestion des cheminsos.path.exists(‘path’), os.path.isdir(‘path’), os.path.getsize(‘path’)

Si vous inspectez interactivement les attributs de ce module, vous obtiendrez une énorme liste de noms qui varient selon la version de Python, qui variera probablement selon la plate-forme, et n’est pas vraiment utile jusqu’à ce que vous ayez appris ce que signifie chaque nom.

Pour afficher la liste des sous-modules, attributs et fonctions du module os, saisissez import os suivi de dir(os) dans l’interpréteur Python.

>>> import os

>>> dir(os)
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXC
L', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LI
VED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P
_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'S
EEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__c
ached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spe
c__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv',
 '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod
', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', '
devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp
', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdec
ode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get
_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb
', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link
', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', '
path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'remo
vedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_
inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st',
 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'stre
rror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 's
upports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_s
ize', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'u
random', 'utime', 'waitpid', 'walk', 'write']

>>>

En plus de tout ça, le module os.path imbriqué exporte encore plus d’outils, dont la plupart sont liés au traitement des noms de fichiers et de répertoires de façon portative.

>>> dir(os.path)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_get_bothseps', '_getfinalpathname', '_getfullpathname', '_getvolumepathname', 'abspath', 'altsep', 'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'splitunc', 'stat', 'supports_unicode_filenames', 'sys']

>>>

Outils administratifs

Juste au cas où ces listings massives ne suffiraient pas, expérimentons interactivement avec certains des outils les plus couramment utilisés. Comme le module sys, le module os est livré avec une collection d’outils d’information et d’administration.

>>> os.getpid()
6016

>>> os.getcwd()
'C:\\Users\\mohamed'

>>> os.chdir('c:\\users')

>>> os.getcwd()
'c:\\users'

>>>

Comme indiqué ici, la fonction os.getpid donne l’ID du processus appelant (un identificateur unique défini par le système d’exploitation pour un programme en cours d’exécution, utile pour le contrôle de processus), et os.getcwd renvoie le répertoire de travail courant. Le répertoire de travail actuel est celui où les fichiers ouverts par votre script sont supposés être actifs, à moins que leur nom ne contienne des chemins de répertoire explicites.

Par exemple, si vous tentez d’exécuter la commande suivante au sein de votre script Python:

f=open("monfichier.txt")

l’interpréteur Python va chercher et accéder au fichier monfichier.txt dans le dossier courant (obtenu avec la méthode os.getcwd()) car vous n’avez pas spécifier son chemin complet. Si le fichier existe dans un répertoire différent, utilisez l’instruction os.chdir() pour dire à l’interpréteur Python d’utiliser le nouveau répertoire.

 

Constantes de portabilité

Le module os possède également un ensemble d’outils conçus pour simplifier la programmation multi-plateforme. Il inclut des paramètres spécifiques à la plate-forme courante comme les caractères séparateurs dans les chemin de fichiers et de répertoires, les indicateurs de répertoire parent/courant et les caractères utilisés pour terminer les lignes.

>>> os.pathsep, os.sep, os.pardir, os.curdir, os.linesep
(';', '\\', '..', '.', '\r\n')

>>>

os.sep est le caractère utilisé pour séparer les composants du chemin d’un répertoire sur la plate-forme sur laquelle Python est en cours d’exécution; il est automatiquement préréglé à \ sur Windows, / pour les machines POSIX, et: sur certains machines Mac. De même, os.pathsep fournit le caractère qui sépare les répertoires sur une listes de répertoires, : pour POSIX et ; pour DOS et Windows.

En utilisant ces attributs lors de la composition et de la décomposition de chaînes de caractères liées au système dans nos scripts, nous rendons les scripts entièrement portables. Dans l’exemple ci-dessous, un appel de la forme dirpath.split (os.sep) va extraire correctement les composants du chemin contenu dans la variable dirpath indépendamment de la plateforme utilisée, bien que dirpath puisse ressembler à dir \dir sous Windows, dir/dir sous Linux et dir:dir on quelques Macs.

>>> dirpath=os.getcwd()

>>> dirpath.split(os.sep)
['c:', 'users']

>>>

Comme mentionné précédemment, sous Windows, vous pouvez généralement utiliser des barres obliques plutôt que des barres obliques inversées pour spécifier des noms de fichier à ouvrir, mais comme vous pouvez le constater, les constantes de portabilité permettent aux scripts d’être neutres vis-à-vis de la plateforme utilisé dans de traitement des dossiers et des fichiers.

Outils importants du sous-module os.path

Le module imbriqué os.path fournit un grand nombre d’outils liés à gestion des répertoires/fichiers. Par exemple, il inclut des fonctions portables pour des tâches telles que la vérification du type d’un fichier (isdir, isfile, et autres); tester l’existence du fichier (os.path.exists); et récupérer la taille d’un fichier par son nom (getsize).

>>> os.path.isdir(r'C:\Users') # r signifie raw (brûte en français), et permet de d'éviter 
True                           # le traitement des caractères spéciaux

>>> os.path.isfile(r'C:\Users')
False

>>> os.path.isdir(r'C:\config.sys')
False

>>> os.path.isfile(r'C:\config.sys')
True

>>> os.path.isdir('element_inexistant')
False

>>> os.path.isfile('element_inexistant')
False

>>> os.path.exists(r'c:\Users\Brian')
False

>>> os.path.exists(r'c:\Users\Default')
True

>>> os.path.getsize(r'C:\ftconfig.ini')
383

>>>

Les appels os.path.isdir et os.path.isfile nous indiquent si un nom de fichier est un répertoire ou un fichier simple; les deux retournent False si le fichier nommé n’existe. Le module os offre également des méthodes pour fractionner et fusionner des chemins de répertoire, qui utilisent automatiquement les conventions de noms de répertoires sur la plate-forme sur laquelle Python est en cours d’exécution.

>>> os.path.split(r'C:\temp\data.txt')
('C:\\temp', 'data.txt')

>>> os.path.join(r'C:\temp', 'output.txt')
'C:\\temp\\output.txt'

>>> name = r'C:\temp\data.txt' # chemin Windows

>>> os.path.dirname(name)
'C:\\temp'

>>> os.path.basename(name)
'data.txt'

>>> name = '/home/lutz/temp/data.txt' # style de chemins Unix
>>> os.path.dirname(name)
'/home/lutz/temp'

>>> 

>>> os.path.basename(name)
'data.txt'

>>> os.path.splitext(r'C:\Python\Examples\sys\ex01.pyw')
('C:\\Python\\Examples\\sys\\ex01', '.pyw')

>>>

La méthode os.path.split sépare un nom de fichier du chemin de son répertoire, et os.path.join les rassemble. Le tout de manière entièrement portable en utilisant les conventions de chemin de la machine sur laquelle elles sont appelés.

Les méthodes dirname et basename renvoient le premier et le second élément renvoyés par os.path.split, et la méthode splitext permet d’extraire l’extension du fichier.

>>> os.sep
'\\'

>>> pathname = r'C:\python\Examples\exo\window.pyw'

>>> os.path.split(pathname) # séparer le nom du fichier du chemin de son repértoire parent
('C:\\python\\Examples\\exo', 'window.pyw')

>>> pathname.split(os.sep) # extraire tous les éléments du chemin
['C:', 'python', 'Examples', 'exo', 'window.pyw']

>>> 

>>> os.sep.join(pathname.split(os.sep))
'C:\\python\\Examples\\exo\\window.pyw'

>>> 

>>> os.path.join(*pathname.split(os.sep))
'C:python\\Examples\\exo\\window.pyw'

>>>

Le dernier appel de fusion nécessite des arguments individuels (d’où le *) mais n’insère pas une première barre oblique en raison de la syntaxe des noms des lecteur disque dans Windows; utilisez la méthode str.join si la différence est importante.

Enfin, puisque les noms de fichiers sont relatifs au répertoire de travail en cours quand ils ne sont pas spécifiés par des chemins entièrement complets, la fonction os.path.abspath va vous aider à savoir quel répertoire est vraiment utilisé pour stocker votre fichier.

 

 

 

 

 

 

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here