• [^] # Re: re

    Posté par . En réponse au message Scripts avec une double interface CLI / CGI. Évalué à 2.

    Pour le cli tu veux te connecté directement (via ssh ou genre putty) et executé tes commandes en directe ou envoyer juste la commande à executé via le réseau web comme le CGI ?

    Non, le mode CLI, c’est pour exécuter directement sur ma machine, comme n’importe quel autre de mes scripts. Le mode CGI est un « bonus » pour mes collègues, mais j’écris mes scripts aussi pour moi-même et la ligne de commande est pour moi une interface beaucoup plus naturelle qu’un formulaire dans un navigateur.

    Pour l’instant, ce que je fais ressemble à peu près à ça (en un peu moins à LA RACHE quand même) :

    #!/usr/bin/python
    import sys, os, getopt, cgi
    if __name__ == '__main__':
     # Valeurs par défaut des options
     operation = 'intersection'
     format = 'csv'
     if os.getenv('GATEWAY_INTERFACE'):
     # mode CGI, on récupère les paramètres de la requête CGI
     form = cgi.FieldStorage()
     if len(form) == 0:
     # il n’y en a pas? on affiche le formulaire
     # qui permettra à l’utilisateur de saisir les paramètres
     print """Content-Type: text/html
    <html>
     <body>
     <form action="script.py" method="post" enctype="multipart/form-data">
     <p>Operation to perform:</p>
     <p><input type="text" name="operation" /></p>
     <p>Output format:</p>
     <p>
     <select name="format">
     <option value="xml">XML</option>
     <option value="csv">CSV</option>
     </select>
     </p>
     <p><input type="submit" name="submit" /></p>
     </form>
     </body>
    </html>"""
     # et on termine là pour l’instant, la soumission du
     # formulaire lancera une nouvelle exécution du script
     sys.exit(0)
     else:
     # Il y a des paramètres ? Bien. On les analyse, on
     # vérifie que tout est correct (les paramètres obligatoires
     # sont bien présents, les valeurs sont dans les limites
     # attendues, etc.)...
     operation = form['operation']
     format = form['format']
     else:
     # Pas de variable GATEWAY_INTERFACE ? On est en mode CLI,
     # on parse la ligne de commande
     try:
     opts, args = getopt.getopt(sys.argv[1:], 'o:f:', ['operation=', 'format='])
     except getopt.GetoptError:
     sys.exit(1)
     for o, a in opts:
     if o in ('-o', '--operation'):
     operation = a
     elif o in ('-f', '--format'):
     format = a
     # Arrivé ici, on a les paramètres dont on a besoin dans les
     # les variables 'operation' et 'format', on peut commencer
     # le vrai travail que le script est supposé faire, et qui
     # est indépendant de la manière dont le script a été appelé
     # (ou presque : en mode CGI, il faut quand même penser à faire
     # précéder la sortie d’un en-tête Content-Type)

    Et ce que je voudrais, c’est pouvoir faire la même chose avec moins de code, genre quelque chose comme ça :

    #!/usr/bin/python
    import ModuleMagique
    if __name__ == '__main__':
     m = ModuleMagique.ObjetMagique()
     m.addOption('operation', 'o', 'Operation to perform')
     m.addOption('format', 'f', 'Output format', allowedValues=['csv', 'xml'], defaultValue='csv')
     m.getArgumentsOrDie()
     # Si on arrive ici, c’est que le script a été appelé avec les bons
     # arguments (que ce soit en mode CLI ou en mode CGI), on peut
     # faire ce qu’on a à faire
     operation = m.arguments['operation']
     format = m.arguments['format']

    Ce que je cherche, et que je suis éventuellement prêt à (削除) développer (削除ここまで) bricoler moi-même, c’est ce fameux ModuleMagique...