Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
python:python3_pour_asr [2018/01/05 09:54] herve ballans ancienne révision (2018/01/05 00:26) restaurée |
python:python3_pour_asr [2018/01/09 17:42] (Version actuelle) herve ballans |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
====== Utiliser Python3 en Admin Systèmes et Réseaux ====== | ====== Utiliser Python3 en Admin Systèmes et Réseaux ====== | ||
- | Note : les exemples sont testés avec iptyhon3 | + | Note : les exemples sont testés avec le programme //iptyhon3// (Python 3.6.3, IPython 5.1.0) |
+ | ===== En-tête de fichier ===== | ||
+ | |||
+ | Spécifie l'environnement ainsi que l'encodage utiliusé (utf-8) : | ||
+ | |||
+ | <code> | ||
+ | #!/usr/bin/env python3 | ||
+ | # -*- coding: utf8 -*- | ||
+ | </code> | ||
+ | |||
+ | ===== Documentation ===== | ||
+ | |||
+ | Grace aux docstrings, il est très facile (et recommandé!) de documenter son code : | ||
+ | |||
+ | <code> | ||
+ | def server(): | ||
+ | """Définit les caractéristiques du serveur""" | ||
+ | </code> | ||
+ | |||
+ | L'accès à la documentation peut se faire de 2 manières, soit par la fonction help() : | ||
+ | |||
+ | <code> | ||
+ | help(server) | ||
+ | </code> | ||
+ | |||
+ | soit avec l'attribut //__doc__// | ||
+ | <code> | ||
+ | server.__doc__ | ||
+ | </code> | ||
===== Bash vs Python3 ===== | ===== Bash vs Python3 ===== | ||
+ | |||
+ | Les exemples de cette section n'ont pas grand sens en soi, ils servent juste ici à illustrer la différence entre l'écriture de routines en bash et en Python. Ces bases serviront pour les sections suivantes. | ||
==== Boucles ==== | ==== Boucles ==== | ||
Ligne 24: | Ligne 54: | ||
</code> | | </code> | | ||
+ | ==== Tests ==== | ||
+ | |||
+ | On teste si l'utilsateur est root : | ||
+ | |||
+ | ^Bash^Python<sup>Note</sup> | | ||
+ | | <code> | ||
+ | if [ `id -u` = 0 ] | ||
+ | then | ||
+ | echo "Attention vous êtes root!" | ||
+ | fi | ||
+ | </code> | <code> | ||
+ | import os | ||
+ | current_user = os.popen('id -u').readlines() | ||
+ | current_user = _ | ||
+ | if (current_user == 0): | ||
+ | print("Attention vous êtes root!") | ||
+ | </code> | | ||
+ | |||
+ | <sup>Note</sup> : on verra par la suite qu'on peut avantageusement remplacer le module os par subprocess… | ||
==== Fonctions ==== | ==== Fonctions ==== | ||
- | ^Bash^Python (avec une f-strings s'il vous plait!)<sup>Note</sup> | | + | ^Bash^Python (avec une f-strings s'il vous plait!)<sup>Note</sup> | |
| <code> | | <code> | ||
function processus() { | function processus() { | ||
Ligne 36: | Ligne 85: | ||
</code> | | </code> | | ||
- | <sup>Note</sup> : Python peut également prendre en paramètres un nombre arbitraire d'arguments, soit sous forme de tuple | + | <sup>Note</sup> : Python peut également prendre en paramètres un nombre arbitraire d'arguments, soit sous forme de tuple |
<code> | <code> | ||
def processus(*args) | def processus(*args) | ||
Ligne 46: | Ligne 95: | ||
def processus(**kwargs) | def processus(**kwargs) | ||
</code> | </code> | ||
- | ===== Modules utiles ===== | + | |
+ | ===== Module os ===== | ||
+ | |||
+ | ce module contient plusieurs objets permettant d'intéragir avec le système | ||
+ | |||
+ | ===== Modules utiles (depuis des librairies standards) ===== | ||
==== subprocess ==== | ==== subprocess ==== | ||
Ligne 56: | Ligne 110: | ||
os.spawn* | os.spawn* | ||
</code> | </code> | ||
+ | |||
+ | Utilisation avec la classe <font inherit/Courier New,Courier,monospace;;inherit;;inherit>Popen</font> : | ||
+ | |||
+ | ''subprocess.''''Popen'' ( //args//, //bufsize=-1//, //executable=None//, //stdin=None//, //stdout=None//, //stderr=None//, //preexec_fn=None//, //close_fds=True//, //shell=False//, //cwd=None//, //env=None//, //universal_newlines=False//, //startupinfo=None//, //creationflags=0//, //restore_signals=True//, //start_new_session=False//, //pass_fds=()//, //*//, //encoding=None//, //errors=None// ) | ||
Par exemple, pour faire l'équivalent de 2 commandes chainées avec un pipe (<font inherit/Courier New,Courier,monospace;;inherit;;inherit>|</font>) | Par exemple, pour faire l'équivalent de 2 commandes chainées avec un pipe (<font inherit/Courier New,Courier,monospace;;inherit;;inherit>|</font>) | ||
Ligne 82: | Ligne 140: | ||
* Une fois que l'appel de la fonction communicate() a généré la sortie, le processus est terminé. Ce qui veut dire que le résultat n'est généré qu'une fois en mémoire. Si je fais print(p2.communicate()), la première fois le résultat sera affiché mais si je le rapelle je tombe sur une exception de type <font inherit/Courier New,Courier,monospace;;inherit;;inherit>ValueError: read of closed file</font> | * Une fois que l'appel de la fonction communicate() a généré la sortie, le processus est terminé. Ce qui veut dire que le résultat n'est généré qu'une fois en mémoire. Si je fais print(p2.communicate()), la première fois le résultat sera affiché mais si je le rapelle je tombe sur une exception de type <font inherit/Courier New,Courier,monospace;;inherit;;inherit>ValueError: read of closed file</font> | ||
- | Si on veut garder la sortie, on peut sauvegarder le résultat dans un variable. \\ \\ | + | Si on veut garder la sortie, on peut sauvegarder le résultat dans un variable. Exemple : |
- | Exemple : | + | |
<code> | <code> | ||
Ligne 94: | Ligne 151: | ||
In [8]: failed_syslog_format = str(failed_syslog) | In [8]: failed_syslog_format = str(failed_syslog) | ||
- | In [9]: failed_syslog_format.split('\\n') | + | In [9]: failed_syslog_format.split('n') |
</code> | </code> | ||
Ligne 113: | Ligne 170: | ||
Out [10]: CompletedProcess(args=['ls', '-la', '/home'], returncode=0) | Out [10]: CompletedProcess(args=['ls', '-la', '/home'], returncode=0) | ||
</code> | </code> | ||
+ | |||
+ | Voir la [[https://pymotw.com/3/subprocess/index.html|page dédiée à ce module]] sur le site Python 3 Module of the Week | ||
+ | |||
+ | ==== Shlex ==== | ||
+ | |||
+ | Le module shlex est un analyseur lexical qui permet d'utiliser une syntaxe ressemblant à ce qu'on peut faire en shell. Le module shlex définit 2 fonctions split() et quote() et une sous-classe shlex qui contient plusieurs méthodes. | ||
+ | |||
+ | Par exemple, j'ai une adresse IP et je souhaite afficher les nombres qui la composent avec des retours chariots. | ||
+ | |||
+ | En bash (il y a peut être plus simple…) | ||
+ | |||
+ | <code> | ||
+ | $ ip="192.168.56.1" | ||
+ | $ IFS=. read -a ip <<<"$ip" | ||
+ | $ printf '%sn' "${ip[@]}" | ||
+ | </code> | ||
+ | |||
+ | Note : sur la dernière ligne, il faut ajouter un //backslash// entre <font inherit/Courier New,Courier,monospace;;inherit;;inherit>%s</font> et <font inherit/Courier New,Courier,monospace;;inherit;;inherit>n</font> (mais ne s'affiche pas dans Dokuwiki !) | ||
+ | |||
+ | Un exemple d'équivalent avec le module shlex pourrait être : | ||
+ | |||
+ | <code> | ||
+ | ip = "192.168.56.1" | ||
+ | |||
+ | nb = shlex.shlex(ip, punctuation_chars=".", posix=True) | ||
+ | |||
+ | nb.whitespace += '.' | ||
+ | |||
+ | for nombre in nb: | ||
+ | print(nombre) | ||
+ | </code> | ||
+ | |||
+ | Voir la [[https://pymotw.com/3/shlex/index.html|page dédiée à ce module]] sur le site Python 3 Module of the Week | ||
\\ | \\ | ||