Note : les exemples sont testés avec iptyhon3 (Python 3.6.3, IPython 5.1.0)
Spécifie l'environnement ainsi que l'encodage utiliusé (utf-8) :
#!/usr/bin/env python3 # -*- coding: utf8 -*-
On veut lister les 10 premiers numéros de pid avec des retours chariots (pour manipuler de vrais pid, voir l'exemple plus loin après la présentation du module subprocess)
Bash | Python |
---|---|
pid_list="echo {1..10}" for pid in `eval $pid_list` do echo "$pid" done | pid_list = range(1,11) for pid in pid_list: print(pid) |
On teste si l'utilsateur est root :
Bash | PythonNote |
---|---|
if [ `id -u` = 0 ] then echo "Attention vous êtes root!" fi | import os current_user = os.popen('id -u').readlines() current_user = _ if (current_user == 0): print("Attention vous êtes root!") |
Note : on verra par la suite qu'on peut avantageusement remplacer le module os par subprocess…
Bash | Python (avec une f-strings s'il vous plait!)Note |
---|---|
function processus() { echo "Il s'agit du process $1" } | def processus(pid): print(f"Il s'agit du process {pid}") |
Note : Python peut également prendre en paramètres un nombre arbitraire d'arguments, soit sous forme de tuple
def processus(*args)
ou de dictionnaire
def processus(**kwargs)
ce module contient plusieurs objets permettant d'intéragir avec le système
Ce module est destiné à remplacer progressivement les modules et fonctions suivants considérés comme devenant obsolètes :
os.system os.spawn*
Utilisation avec la classe Popen :
subprocess.
Popen
( args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexecfn=None, closefds=True, shell=False, cwd=None, env=None, universalnewlines=False, startupinfo=None, creationflags=0, restoresignals=True, startnewsession=False, pass_fds=(), *, encoding=None, errors=None )
Par exemple, pour faire l'équivalent de 2 commandes chainées avec un pipe (|)
En bash :
$ cat /var/log/syslog |grep -i failed
En Python avec le module subprocess :
In [1]: import subprocess In [2]: p1 = subprocess.Popen(["cat","/var/log/syslog"],stdout=subprocess.PIPE) In [3]: p2 = subprocess.Popen(["grep","-i","failed"],stdin=p1.stdout, stdout=subprocess.PIPE) In [4]: p2.communicate()
Le résultat en sortie est un tuple. 2 remarques :
Si on veut garder la sortie, on peut sauvegarder le résultat dans un variable. Exemple :
In [7]: failed_syslog = p2.communicate()
Et pour le lire différemment que sous la forme d'un tuple, on peut par exemple faire :
In [8]: failed_syslog_format = str(failed_syslog) In [9]: failed_syslog_format.split('n')
A partir de la version 3.5 de Python, la fonction run() a été rajoutée : cette fonction lance la commande décrite par args, attend que la commande se termine et renvoie une instance CompletedProcess
subprocess.
run
( args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None )
Note : les 2 derniers paramètres encoding et errors n'existent qu'à partir de la version 3.6
Exemple pour lister le contenu de /home :
In [10]: subprocess.run(["ls","-la","/home"]) total 12 drwxr-xr-x 3 root root 4096 nov. 13 10:25 . drwxr-xr-x 25 root root 4096 janv. 4 10:53 .. drwxr-xr-x 26 rvb rvb 4096 janv. 3 16:35 rvb Out [10]: CompletedProcess(args=['ls', '-la', '/home'], returncode=0)
Voir la page dédiée à ce module sur le site Python 3 Module of the Week
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…)
$ ip="192.168.56.1" $ IFS=. read -a ip <<<"$ip" $ printf '%sn' "${ip[@]}"
Note : sur la dernière ligne, il faut ajouter un backslash entre %s et n (mais ne s'affiche pas dans Dokuwiki !)
Un exemple d'équivalent avec le module shlex pourrait être :
ip = "192.168.56.1" nb = shlex.shlex(ip, punctuation_chars=".", posix=True) nb.whitespace += '.' for nombre in nb: print(nombre)
Voir la page dédiée à ce module sur le site Python 3 Module of the Week