- Le blog participatif de bioinformatique francophone depuis 2012 -

Ajoutez une interface graphique à votre script en 4 lignes avec Gooey

Vous venez de ter­mi­ner votre ana­lyse bio-infor­ma­tique. Pour cette der­nière, vous avez réa­li­sé un script qui pour l'instant, il faut le dire, n'est pas du tout réuti­li­sable par une tierce per­sonne. Même vous dans 6 mois vous n'êtes pas sûr de vous sou­ve­nir de ce que vous avez fait. Pour­tant, l'un des inté­rêts de la pro­gram­ma­tion est de pou­voir répé­ter des cal­culs de manière auto­ma­tique. Par consé­quent, ce serait pra­tique de rendre votre script un peu plus souple afin de ne pas devoir modi­fier son code source à chaque fois qu'un para­mètre de votre ana­lyse change. De plus, il serait bien que les bio­lo­gistes qui tra­vaillent avec vous puissent éga­le­ment uti­li­ser votre script, après tout le bou­lot d'un bio-infor­ma­ti­cien c'est aus­si de faire l'interface entre les bio­lo­gistes et les infor­ma­ti­ciens non ?

Nous allons voir com­ment rendre un script faci­le­ment uti­li­sable, en gar­dant un code clair, le tout en Python.

sys.argv : une fausse bonne idée

Contexte

Admet­tons que vous ayez un script (que nous nom­me­rons

 ) qui prend comme para­mètres le nom d'un fichier d'entrée et le nom d'un fichier de sor­tie. La pre­mière idée peut être de se dire que le pro­gramme doit être appe­lé de la façon sui­vante :

Pour cela vous pou­vez uti­li­ser la biblio­thèque

de Python. Cette der­nière vous four­ni­ra un tableau qui per­met d'accéder aux para­mètres de votre ligne de com­mande :

Pour ceux qui se posent la ques­tion,

cor­res­pond au nom de votre script.

Ça se complique

Vous pou­vez tout à fait faire fonc­tion­ner votre script ain­si, seule­ment il y aura des tests à effec­tuer, notam­ment pour savoir si le fichier d'entrée existe. Certes un

au début de votre code pour­rait faire l'affaire.

Cepen­dant, ima­gi­nons main­te­nant que votre script qui réa­lise plu­sieurs étapes, puisse affi­cher le temps de cal­cul de chaque trai­te­ment, ou pas, selon les dési­rs de l'utilisateur. Pour cela il fau­drait rajou­ter une option, par exemple "-t" comme Time. Votre script se base sur un logi­ciel dont il connaît la loca­li­sa­tion mais que faire si un jour il est ins­tal­lé dans un autre réper­toire ? Ça peut être le cas si plu­sieurs ver­sions d'un même logi­ciel coexistent sur une machine. Il fau­drait que votre script par défaut fasse appel au réper­toire d'installation clas­sique du logi­ciel (ex : /​usr/​bin/​soft) mais, qu'il soit éga­le­ment pos­sible de spé­ci­fier un autre che­min, dans le cas où on vou­drait tes­ter une nou­velle ver­sion par exemple. Une option "–path" serait la bien­ve­nue pour cela. Enfin, comme dans tout logi­ciel uti­li­sable en ligne de com­mande, on aime­rait que l'option "-h" ou "–help" affiche l'aide.

Pour réa­li­ser tout ceci vous pou­vez vous engouf­frer dans des

sans fin en uti­li­sant la biblio­thèque

mais vous voyez bien que cela devient vite com­pli­qué.

args parse : gérer plus finement les options en ligne de commande

Les dif­fé­rentes options décrites pré­cé­dem­ment peuvent sim­ple­ment être implé­men­tées de la manière sui­vante :

Et voi­là !

Deux choses inté­res­santes sont à noter :

  1. Vous avez sépa­ré la ges­tion des options de l’exécution du pro­gramme. Plus besoin d'ajouter une tonne de
    if au début de votre script. Tout ceci est fait auto­ma­ti­que­ment, vous avez juste à vous concen­trer sur votre pro­gramme en lui-même. Si vous désirez rajou­ter une option vous n'avez qu'une ligne à ajou­ter, vous n'avez pas besoin de "tout cas­ser" dans votre code.
  2. L'aide est réa­li­sée auto­ma­ti­que­ment. Vous pou­vez l'afficher avec l'option "-h" ou "–help", cf. ci-des­sous.
Exemple d'aide crée par argsparse
Exemple d'aide créée par arg­sparse

La biblio­thèque

  per­met de faire de nom­breuses choses, je vous invite à lire la doc pour obte­nir plus d'informations.

Gooey : l'ajout d'interface graphique

Notre script peut main­te­nant affi­cher une aide convi­viale, ce qui est bien sym­pa­thique pour les uti­li­sa­teurs sen­si­bi­li­sés aux lignes de com­mande. Mais que faire pour les autres ?

Bonne nou­velle, la biblio­thèque Gooey per­met de réa­li­ser une inter­face gra­phique en ajou­tant 4 lignes à notre code pré­cé­dent !

  1. Met­tez votre pro­gramme dans une fonc­tion, vous pou­vez choi­sir
    main par exemple
  2. Ajou­tez
    @Gooey au des­sus de votre fonc­tion
  3. Impor­tez la biblio­thèque :
    from gooey import Gooey
  4. N'oubliez pas d’appeler votre fonc­tion
    main dans votre code :)

Voi­là ce que ça donne pour notre exemple :

@Gooey
def main():
softPath="/usr/bin/soft"
par­ser = argparse.ArgumentParser()
parser.add_argument("input", help="Input File",type=argparse.FileType('r'))
parser.add_argument("output", help="Output File",type=argparse.FileType('w'))
parser.add_argument("-t", help="Print time",action='store_true')
parser.add_argument("–path", help="Path to software",default=softPath)
parser.parse_args()

main()

Et voi­ci la fenêtre obte­nue :

Exemple de fenêtre créée par Gooey
Exemple de fenêtre créée par Gooey

Bien enten­du, la fenêtre est "simple" mais par rap­port au peu de lignes de code deman­dées pour la géné­rer ça me semble être un bon com­pro­mis.

Vous savez main­te­nant com­ment faire pour ajou­ter des options à votre script sans que ça soit l'anarchie dans votre code, puis com­ment ajou­ter une fenêtre en seule­ment quelques lignes de code, à vous de jouer !

Mer­ci à Nico M., NiGo­Pol et Nisaea_​ pour les com­men­taires et dis­cus­sions lors de l’édition de cet article.

Vous avez aimé ? Dites-le nous !

Moyenne : 0 /​ 5. Nb de votes : 0

Pas encore de vote pour cet article.

Partagez cet article :




Commentaires

3 réponses à “Ajoutez une interface graphique à votre script en 4 lignes avec Gooey”

  1. Super lib !

    Elle est très confi­gu­rable, c'est fran­che­ment sym­pa pour faire un end-user rapi­de­ment.

    Le point vache­ment rigo­lo, c'est qu'en essayant d'implémenter la com­pa­ti­bi­li­té avec docopt (une autre lib pour CLI, que je conseille), les main­te­neurs ont per­mis l'usage simul­ta­né de docopt et arg­parse !

    Ç'eût été le but ini­tial que per­sonne n'aurais réus­si…

    1. Clément
      ClemBuntu

      Wow docopt c'est hyper puis­sant je ne connais­sais pas oO ça existe dans plu­sieurs lan­gages en plus !
      Mer­ci pour la décou­verte.

      1. lien docopt : http://​docopt​.org/

        Si pour un CLI simple docopt c'est effec­ti­ve­ment excellent, je le trouve assez limi­té à l'usage, dans les cas plus com­plexe que l'exemple.

        Le pro­blème prin­ci­pal vient du fait que des options manquent, mais que les main­te­neurs veulent gar­der le pro­jet « simple ». C'est un choix, mais de fait, on fini par par­ser à la main le dic­tion­naire ren­voyé par docopt.
        J'ai plu­sieurs pro­jets per­so où un module est spé­ci­fi­que­ment dédié à l'appel de docopt et au post trai­te­ment des don­nées reçues.

        Dans ces cas là, pas­ser à arg­parse est, para­doxa­le­ment, plus lisible.

Laisser un commentaire