Outils pour utilisateurs

Outils du site


python:python3_pour_asr

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 10:40]
herve ballans
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 ====
  
Ligne 46: Ligne 95:
 def processus(**kwargs) def processus(**kwargs)
 </​code>​ </​code>​
 +
 +===== Module os =====
 +
 +ce module contient plusieurs objets permettant d'​intéragir avec le système
  
 ===== Modules utiles (depuis des librairies standards) ===== ===== Modules utiles (depuis des librairies standards) =====
Ligne 60: Ligne 113:
 Utilisation avec la classe <font inherit/​Courier New,​Courier,​monospace;;​inherit;;​inherit>​Popen</​font>​ : Utilisation avec la classe <font inherit/​Courier New,​Courier,​monospace;;​inherit;;​inherit>​Popen</​font>​ :
  
-''​subprocess.''''​Popen''​ +''​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//​ )
-( //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 89: 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 101: 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 120: 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 ==== ==== Shlex ====
  
-Le module shlex est un parseur ​simple à utiliser+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
  
 \\ \\
  
  
python/python3_pour_asr.1515145200.txt.gz · Dernière modification: 2018/01/05 10:40 par herve ballans