Un monde d'octets

Aller au contenu | Aller au menu | Aller à la recherche

lundi, mars 15 2021

Python : supprimer l'output standard d'un bloc de code

Voici une facon de supprimer l'output de certains blocs en python, avec la notion de context manager, et l'utilisation de with pour limiter la portée de l'action :

from contextlib import contextmanager
import sys, os

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

Et maintenant, en profitant du context management, nous pouvons supprimer les sorties quand nous le souhaitons :

print("Now you see it")
with suppress_stdout():
    print("Now you don't")

mardi, mars 9 2021

Donner un accès rapide à un dossier via http (Quick and Dirty)

python3 -m http.server 8000

Python créera un serveur web dont la racine est le répertoire courant et servira l'arborescence, ce qui permet de télécharger des fichiers et de tuer ce micro serveur dans la foulée.

samedi, décembre 26 2020

Python : faire un package

Pour faire un package python, il faut créer un fichier setup.py :

import setuptools

setuptools.setup(
    name="simplanimator", # Replace with your own username
    version="0.0.2",
    author="Me First Name Last Name",
    author_email="me@tlc.com",
    description="SimplAnimator, a class to animate graph based on mathplotlib",
    url="",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

Et nous mettons notre package dans un dossier "simplanimator" juste au même niveau que le "setup.py".

Nous pouvons ensuite installer le package avec :

sudo python3 setup.py install


ou pour une installation mono utilisateur :

python3 setup.py install --user

jeudi, décembre 17 2020

Memcached : python script pour lister les clefs présentes

Un petit script pour lister les couple clef/valeurs présentes dans notre memcached en python, qui nécessitait une lib python non disponible dans pip ...

#!/usr/bin/env python3

''' 
  pip3 install 'git+git://github.com/dlrust/python-memcached-stats.git'
''' 
                                                                                                        
from memcached_stats import MemcachedStats
from pymemcache.client.base import Client

mem = MemcachedStats()
client = Client(server="localhost")

keys=[]

for key in mem.keys():
  if (not key in keys):
    result = client.get(key)
    print (key,"=>",result)
    keys.append(key)

lundi, novembre 23 2020

Python : pip et keyring

Il peut arriver lors d'installation via pip (ou pip3) que celui-ci freeze longuement au lancement de la commande.

Pip essaye en fait de contacter un keyring, et celui-ci est terriblement long à répondre. On peut le constater avec un pip3 -v install

$ pip3 install xxxx -v
[...]
Found index url https://pypi.org/simple
Getting credentials from keyring for https://pypi.org/simple

Il m'a fallu interrompre avec ctrl-c

Pour éviter ce problème, il faut indiquer à pip/pip3 d'utiliser un placebo en guise de backend pour les keyring :

export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring

Suite à cette commande, votre pip est beaucoup plus rapide !

mercredi, juillet 29 2020

Python unbuffered output

Il est parfois nécessaire d'avoir une sortie non bufferisée, si nous voulons des output temps réél par exemple.

Pour cela, on peut utiliser une classe qui permettra d'obtenir un objet surchargé :

#!/usr/bin/env python3 

import sys, os

class Unbuffered(object):
    def __init__(self, stream):
        self.stream = stream

    def write(self, data):
        self.stream.write(data)
        self.stream.flush()

    def writelines(self, datas):
        self.stream.writelines(datas)
        self.stream.flush()

    def __getattr__(self, attr):
        return getattr(self.stream, attr)

sys.stdout = Unbuffered(sys.stdout)

dimanche, mai 24 2020

Check video

Pour faire un check video, une solution simple et basique est d'extraire les images toutes les "x" frames et d'en faire un montage style bobine analogique :)

ffmpeg -i input.mp4 -vf scale=320:240 -r 1/120 bobine_%04d.jpeg

puis on peut faire un montage horizontal de ces images avec les commandes d'imagemagick ou avec le script python suivant :

#!/usr/bin/env python3 
import sys
import glob
from PIL import Image

try: 
  imgs = [ Image.open(i) for i in sys.argv[1:] ]
except:
  sys.exit(0)

Image.MAX_IMAGE_PIXELS = 100000000  # handling very large images
widths, heights = zip(*(i.size for i in imgs))
dst_width = sum(widths)
dst_height = max(heights)

new_im = Image.new('RGB', (dst_width, dst_height))
new_im.paste(imgs[0],(0,0))

offset=0
for i in range(1,len(imgs),1):
  offset+=imgs[i-1].size[0]  # update offset
  new_im.paste(imgs[i],(offset,0))

new_im.save('output_horizontal_montage.jpg')

Ce script est aisément modifiable pour vaire un montage vertical.

vendredi, mars 13 2020

OVH et API Openstack

Nous commençons par l'installation des outils python nécessaires :

apt install -y python2-novaclient python3-openstackclient

Puis dans l'interface de gestion du cloud du manager ovh, nous allons dans "Users and Role".

La, pour l'utilisateur créé disposant des droits que nous voulons, nous pouvons télécharger le fichier "openrc.sh" qui une fois exécuté positionne les variables d'environnement de nova. Un mot de passe (celui du user) vous sera demandé.

Une fois l'authentification faite, vous pouvez lister vos instances :

nova list

Vous pouvez aussi lister les differents modèles supportés par ovh :

nova flavor-list

et enfin, lister les images disponibles pour l'installation :

glances image-list

Nous pouvons créer une instance flavor "B2-7" et image "ubuntu 16.04" comme suit :

nova boot --flavor 0ff9e048-50af-4b2e-bc61-72611d23fca7 --image b6ed344f-0942-4f32-aa14-2476fe08c3e0 mon-instance-a-moi

(Attention à la facturation!!!)

Pour détruire l'instance :

nova delete Instance1

mardi, février 11 2020

API OVH et Python

Python est toujours aussi génial ! Il existe des modules pour presque tout, mais ici nous allons parler de celui qui permet d'utiliser l'api d'ovh.

import ovh

client = ovh.Client(endpoint='ovh-eu',
                    application_key='XXXXXXXXXXXXXXXXXXX',
                    application_secret='XXXXXXXXXXXXXXXXXXXXXXXXXXX',
                    consumer_key='XXXXXXXXXXXXXXXXXXXXXXXXXXX'
                    )

def dump_object(path):
  print (path)
  try:
    obj=client.get(path)
  except:
    return 
  
  print (json.dumps(obj,indent=2))

farm=client.get('/')

print (json.dumps(client.get('/'),indent=2))

for x in farm['apis']:
  dump_object(x['path'])
  print ("")

Ce script vous faire un dump simple du contenu de l'api d'ovh accessible en get depuis la racine. Il vous faut pour cela des credentials, que vous obtenez via ce formulaire : https://eu.api.ovh.com/createToken/

Vous pouvez définir les accès lié a ces tokens, et leur validité. Très pratique pour des applications en "prêt".

Il existe aussi ovh-cli, une cli pour faire quelques opérations élémentaires relatives à l'api.

pip3 install ovhcli

Puis vous configurez avec :

ovh setup init

Et si vous avez tout bien saisi, un premier :

ovh me info

Voila :)

jeudi, janvier 2 2020

Injection DLL

Décidément, y'a génies du python. Un script d'injection de lib dans un process en cours d'exécution :

https://github.com/DavidBuchanan314...

vendredi, octobre 18 2019

Algorithme de calcul rapide du pgcd et ppcm

La décomposition en facteur premier est couteuse, même lorsqu'on à la liste des facteurs premiers en mémoire du programme. Il existe cependant des propriétés mathématiques permettant de calculer PGCD et PPCM sans passer par ces décompositions :

L'algorithme d'Euclide, et la propriété pgcd(a,b)*ppcm(a,b)=a*b

#!/usr/bin/env python3

def pgcd(a,b):
  while (b > 0):
    temp = b 
    b = a % b
    a = temp
  return a


def ppcm(a,b):
  return (int(a * (b / pgcd(a, b))))

Ceci fut trouvé dans le cadre d'un quizz hackerone et adapté en python.

A noter qu'il existe cet autre algorithme rapide de calcul du pgcd basé sur les propriété paires/impaires du pgcd : PCGD Binaire

Et comme je continue d'utiliser mes connaissances mathématiques, de l'associativité des PGCD et PPCM, on peut maintenant écrire :

def pgcg_array(a):
  p=a[0]
  for i in a[1:]:
    p=pgcd(p,i)
  return(p)

def ppcm_array(a):
  p=a[0]
  for i in a[1:]:
    p=ppcm(p,i)
  return(p)

Enfin, dernière chose à dire d'un point de vue algorithmique. Comme notre calcul du ppcm dépend du calcul du pgdc; autant pour un calcule entre deux entiers, il n'y a rien d'important à changer. Mais quand nous travaillons sur un "array", les calculs sont fait plusieurs fois pour le pgcd. Il est préférable de fusionner le tout ...

def pgcd_ppcm_array(a):
   _pgcd=a[0]
   _ppcm=a[0]
   for i in a[1:]:
     _pgcd=pgcd(_pgcd,i)
     _ppcm=int((_ppcm*i)/_pgcd)

  # Renvoie des deux valeurs sous forme de liste
  return ((_pgcd,_ppcm))

jeudi, avril 4 2019

Python et Introspection

L'avantage de python c'est qu'il est muni de beaucoup de méthodes d'introspection :

Pour avoir la liste des méthodes d'un objet python, on fait comme suit :

import kodipydent
for a in dir(kodipydent):
  print (a)

Ça c'est pour la base, mais bien sur il faut pousser, car certains objets incluent des objets.

Donc pour le cas de kodipydent, pour avoir ce qui nous intéresse vraiment, on instancie l'objet puis on appelle dir sur l'objet contenue dans l'instanciéé :

from kodipydent import Kodi
kodi = Kodi('192.168.1.39')

for method in dir(kodi):
   print (method)

C'est pratique quand vous n'arrivez pas à trouver une doc qui vous liste les méthodes d'une librairie python !

Bref, plus ça va, plus j'aime ce langage, même si en dépit ce que disent les gens, il est tout à fait possible de faire un code difficilement lisible en python, comme cet exemple ci-dessous glané sur le net, qui demande quand même beaucoup de décorticage pour comprendre :

methodList = [e for e in dir(object) if callable(getattr(object, e))]
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print "\n".join(["%s %s" %
   (method.ljust(spacing)
   processFunc(str(getattr(object, method).__doc__)))
   for method in methodList])

Même si au final, c'est compréhensible, pour ceux qui ne maitrisent pas parfaitement lambda et gettattr et les méthodes dir et doc .... bref, vous voyez bien qu'il y'a une partie qui est porteuse d'arcanes python dans ce code.

Mais c'est surtout l’écriture au kilomètre du join, lijust, callable et lambda avec un "for" passé en argument et non pas en boucle contenante, qui rends tout ca très wow wow bobo tétête !

mardi, octobre 23 2018

Python : Lister les modules

Pour liste les modules disponibles, lancez python en mode intepreteur puis tapez les commande :

help()
modules

samedi, juillet 14 2018

Python et les charsets

Mettre ceci en debut de script :

  1. -*- coding: utf-8 -*-.