Python dans org-mode avec des tables en entrée et en sortie

On en parlait avec @Merwyn pendant la PyConFR, mais une démo vaut mieux que démo^Wdes mots :

D’abord ça nécessite un peu de config :

(org-babel-do-load-languages
 'org-babel-load-languages
 '((python . t)))

puis dans un fichier org :

On définit d'abord une table (optionnel mais bon pour la démo)
et on la nomme :

#+tblname: tbl-hostnames
| Host     |
|----------|
| mdk.fr   |
| afpy.org |

Ensuite un peu de Python, qui prend (ou pas) la table en variable
d'entrée :

#+begin_src python :var hostnames=tbl-hostnames
  import subprocess

  pings = []
  for hostname, in hostnames:
      pings.append((hostname, subprocess.run(["ping", "-c1", hostname], stdout=subprocess.PIPE).stdout.decode().splitlines()[-1]))

  return pings
#+end_src

#+RESULTS:
| mdk.fr   | rtt min/avg/max/mdev = 4.698/4.698/4.698/0.000 ms |
| afpy.org | rtt min/avg/max/mdev = 2.951/2.951/2.951/0.000 ms |

Pour exécuter le code (et avoir le `#+RESULTS` qui apparaît tout seul)
c'est comme toujours dans org-mode: `C-c C-c`.

J’entends d’ici les gens râler sur ma virgule après for hostname, haha.

Bon pas besoin de sortir Python pour juste un ping :

 | mdk.fr        | 36.251/36.251/36.251/0.000 ms |
 | afpy.org      | 20.700/20.700/20.700/0.000 ms |
 | deb2.afpy.org | 19.779/19.779/19.779/0.000 ms |
 | bbb.afpy.org  | 20.608/20.608/20.608/0.000 ms |
#+TBLFM: $2='(shell-command-to-string (concat "ping -c 1 " $1 " | tail -n 1 | cut -d= -f2 | tr -d '\n'"))

D’ici à lancer mes playbooks Ansible depuis org-mode y’a qu’un pas…

1 « J'aime »