Extrait de code Python

Formatage et strings

Utiliser les noms des variables pour formater les strings

prefix = "HAHA"
attr = "HOHO"
print "{prefix}{attr}".format(**locals())

Depuis Python 3.6, vous pouvez le faire avec :

prefix = "HAHA"
attr = "HOHO"
print(f"{prefix}{attr}")

Convertir des lettres UTF-8 en leur équivalent ASCII

>>> import unicodedata
>>> unicodedata.normalize('NFKD', u'ö').encode('ascii', 'ignore')
'o'

Source : How to replace unicode characters by ascii characters in Python (perl script given)?

Iterateurs

Voici quelques itérateurs utiles, absents du module itertools.

Itérer par paquets de N éléments dans une liste données

Permet de générer les frame ranges des jobs d’un ferme de rendu (par exemple: génération des RIBs).

Le motif est :ABCDEF -> AB, CD, EF

def chunck(l, n):
    return (l[i:i+n] for i in xrange(0, len(l), n))
>>> list(chunck(range(16),3))
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15]]

Glissement par paire

Utile pour organiser une liste de nœuds connectés à l’intérieur d’un graphe.

Le motif est :ABCDEF -> AB, BC, CD, DE, EF

import itertools

def pair_slide(l):
    return itertools.izip(l, l[1:])
>>> list(pair_slide("ABCDEF"))
[('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E'), ('E', 'F')]

Système

Alternative à psutil (Linux)

import os

def process_info():

    for out in os.popen('ps --no-headers -eo pid:1,user,command'):

        pid, user, cmd = out.rstrip('\n').split(' ', 2)

        pid = int(pid)

        yield pid, user, cmd

Mettre à jour de cache NFS

def update_nfs_cache(path):
    """Update NFS cache to given file path.

    Args:
        path (str): Path to update.
    """
    splitted = path.replace('\\', '/').split('/')

    path_aggregated = splitted.pop(0)

    for item in splitted:

        path_aggregated = '/'.join((path_aggregated, item))

        try:
            os.listdir(path_aggregated)
        except OSError:
            # not a dir, so it's a file, force stats
            try:
                os.stat(path_aggregated)
            except OSError:  # file doesn't exists
                continue

Autres

Profilage

import cProfile, pstats, StringIO
pr = cProfile.Profile()
pr.enable()

# your code

pr.disable()
s = StringIO.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
ps.print_stats(0.1)  # 0.1 for only first 10% lines
print(s.getvalue())

Plus d’informations dans la documentation de pstats.Stats().

Générer et exécuter dynamiquement des commandes Bash en Python

Cela peut être utile pour appeler des fonctions Python modifiant l’environnement du shell courant. Par exemple, pour définir des variables d’environnement après les avoir récupérées en Python.

La commande Bash est la suivante :

eval "$(python print_bash_stuff.py)"

Le fichier print_bash_stuff.py ne fait qu’imprimer dynamiquement des commandes Bash :

print 'function test {\n    echo "toto"\n}\n'
print 'FOO=BAR\n'

Ce qui nous donne :

$ eval "$(python print_bash_stuff.py)"
$ test
toto
$ echo $FOO
BAR

Dernière mise à jour : dim. 22 novembre 2020