Continuons cette petite série fort sympathique, avec aujourd’hui un peu de manipulation de bytes, de gestion d’erreur et de parsing d’arguments de script.
Souvenez vous de ce hack qui permet d’avoir sa video Flash en plein écran sur un écran, et travailler sur l’autre, quand on est en dual screen. Le problème c’est qu’il faut le faire à la main. De plus, il faut recommencer à chaque mise à jour de flash. On va automatiser tout ça.
Faites un script (en Python 3 \o/) qui va parser les arguments de la ligne de commande avec argparse. Il doit déclarer :
- Une docstring.
- Un message d’help à partir de cette docstring.
- Un argument positionnel obligatoire devant être le chemin du binaire flash.
Ensuite on ouvre le fichier, on cherche le fameux _NET_ACTIVE_WINDOW
, on le deface, et on sauvegarde le tout dans le fichier final. Ce sera l’occasion de jouer un peu avec la gestion plus propre du binaire en Python 3.
Contrairement aux exercices précédent, on met un minimum de check d’erreur car c’est un petit script (35 lignes copieusement commentées chez moi): donc au moins avertir proprement l’utilisateur si on ne peut pas lire ou écrire dans le fichier et pourquoi.
Un message d’help à partir de cette docstring.
Bon, pas le choix de la lib on dirait…
Pas de lib externe, que du stdlib pour les exercices python. Toujours.
Comme d’hab, si il y a une ambiguïté dans la consigne, n’hésitez pas à le demander en comment. Ici, idéalement on peut utiliser argparse, mais si vous avez envie de le faire à la main, vous pouvez.
en python 2 un guss l’avait fait très bien https://github.com/jeffbryner/pyHex/blob/master/hexfind.py :
/usr/bin/python hexfind.py -t _NET_ACTIVE_WINDOW -f libflashplayer.so
0F45C00: 5f4e 4554 5f41 4354 4956 455f 5749 4e44 _NET_ACTIVE_WIND
Bon pour l’heure le morceau argparse c’est simpeule mais là la suite … ;)
Leur programme est très générique, c’est une bonne idée cela dit, mais l’exo est beaucoup plus simple.
j’ai tenté ca https://gist.github.com/foxmask/9668068
Bon, Python 2, admettons. Mais pas de check d’erreurs alors que c’est explicitement demandé, bouh ! Mal ! Pas bien ! Méchant foxmask !
Me suis battu avec python 3 . j’ai même fait chier du monde sur le channel sur ça ;) sinonj’ai oublié de check si on pouvait lire/écrire en me contenant de check si le fichier était là. Je laisse un autre faire mieux ! Tant pis pour moi j’assume ;)
A mon tour !
Euh, c’est moi ou il vient de virer l’url que j’ai mise ? Deuxième tentative
@Yamakaky le lien est bon, c’est wordpress qui n’ajoute pas le ‘=’ final de l’url dans le href du coup on touche pas ton bin0 ;) mais ca va en prenant manuellement tout le lien nous meme
Yamakaky a été plus propre que moi et fait de jolies fonctions et un if __main__ :)
\o/
Je me suis posé une question pendant le codage : est-ce qu’il y a un moyen simple de traduire l’interface de argparse, comme l’aide auto-générée ?
Tous les messages d’argparses sont écrits avec le module gettext, donc on peut utiliser les outils standard d’i18n pour le faire. Après la doc est muette dessus, donc ça va demander quelques essais avant de trouver le bon réglage. Encore une raison de préférer docopt.
Ah oui, il utilise argparse. Je vois pas de fichiers d’i18n, du coup faut le faire pour chaque app. Dommage…
Je suis pas sûr docopt soit plus pratique pour le coup ^^