100 votes

Comment imprimer la docstring d'un fichier Python lors de son exécution ?

J'ai un script Python avec une docstring. Lorsque l'analyse des arguments de la ligne de commande n'aboutit pas, je souhaite afficher la chaîne de caractères pour l'information de l'utilisateur.

Existe-t-il un moyen de le faire ?

Exemple minimal

#!/usr/bin/env python
"""
Usage: script.py

This describes the script.
"""

import sys

if len(sys.argv) < 2:
    print("<here comes the docstring>")

2 votes

Il existe des bibliothèques pour l'analyse des arguments de la ligne de commande : argparse (>=2.7) et optparse. docs.python.org/dev/library/argparse.html docs.python.org/dev/library/optparse.html

12 votes

Je le sais, mais cela n'a rien à voir avec la question.

1 votes

Je suis une personne qui, parfois, le fait explicitement no Je veux utiliser argparse pour un script très simple, donc je suis reconnaissant aux personnes ci-dessous qui ont répondu à la question telle qu'elle a été posée.

121voto

Petr Viktorin Points 13687

La docstring est stockée dans le fichier __doc__ globale.

print(__doc__)

D'ailleurs, cela vaut pour tous les modules : import sys; print(sys.__doc__) . Les chaînes de caractères des fonctions et des classes sont également dans leurs __doc__ attribut.

2 votes

Cela fonctionne sans aucun doute, mais il existe une autre façon d'afficher une interface d'aide au module plus native: : help(module_name) après avoir importé ce module.

2 votes

@danbgray Je pense que ce à quoi vous voulez en venir est ce que argparse est utilisé pour

1 votes

FAUTE PYTHON 2 : Si vous mettez, par exemple, "from __future__ import print_function" avant la docstring, ce n'est plus une docstring . Mais vous pouvez mettre "from __future__" import... juste après la docstring, et la règle "from __future__ imports must occur at the beginning of the file" est toujours respectée.

20voto

moose Points 4945

L'analyse des arguments doit toujours être effectuée avec l'option argparse .

Vous pouvez afficher les __doc__ en la passant à la fonction description paramètre de Argparse :

#!/usr/bin/env python
"""
This describes the script.
"""

if __name__ == '__main__':
    from argparse import ArgumentParser
    parser = ArgumentParser(description=__doc__)
    # Add your arguments here
    parser.add_argument("-f", "--file", dest="myFilenameVariable",
                        required=True,
                        help="write report to FILE", metavar="FILE")
    args = parser.parse_args()
    print(args.myFilenameVariable)

Si vous appelez ce mysuperscript.py et l'exécuter :

$ ./mysuperscript.py --help
usage: mysuperscript.py [-h] -f FILE

This describes the script.

optional arguments:
  -h, --help            show this help message and exit
  -f FILE, --file FILE  write report to FILE

15voto

wint3rschlaefer Points 61

Voici une alternative qui ne code pas en dur le nom de fichier du script, mais qui utilise sys.argv[0] pour l'imprimer. L'utilisation de %(scriptName)s au lieu de %s améliore la lisibilité du code.

#!/usr/bin/env python
"""
Usage: %(scriptName)s

This describes the script.
"""

import sys
if len(sys.argv) < 2:
   print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
   sys.exit(0)

0 votes

Merci. J'ai généralement une fonction usage() qui utilise sys.argv[0] et qui est appelée avant d'imprimer la chaîne de documents.

0 votes

@wint3rschlaefer, pourriez-vous expliquer comment Usage : %(NomScript)s obtient le nom du script ? Comment s'appelle ce mécanisme en Python ?

1 votes

@wint3rschlaefer Peut-être que cela vaut la peine de mettre à jour avec une version de python3, comme """Usage: {scriptName}""".format(scriptName = sys.argv[0])

2voto

jhale1805 Points 124

Une amélioration de la réponse de @MartinThoma pour qu'elle imprime des chaînes de documents multi-lignes, inspirée par Python argparse : Comment insérer une nouvelle ligne dans le texte d'aide ? .

L'analyse des arguments doit toujours être effectuée avec argparse.

Vous pouvez afficher les doc en la passant à la description de Argparse :

#!/usr/bin/env python 
""" 
This summarizes the script.

Additional descriptive paragraph(s).
"""  # Edited this docstring

if __name__ == '__main__':
    from argparse import ArgumentParser, RawTextHelpFormatter  # Edited this line
    parser = ArgumentParser(description=__doc__
                            formatter_class=RawTextHelpFormatter)  # Added this line
    # Add your arguments here
    parser.add_argument("-f", "--file", dest="myFilenameVariable",
                        required=True,
                        help="write report to FILE", metavar="FILE")
    args = parser.parse_args()
    print(args.myFilenameVariable) 

Si vous appelez ce mysuperscript.py et que vous l'exécutez, vous obtenez :

$ ./mysuperscript.py --help
usage: mysuperscript.py [-h] -f FILE

This summarizes the script.

Additional descriptive paragraph(s).

optional arguments:
  -h, --help            show this help message and exit
  -f FILE, --file FILE  write report to FILE

Sans l'ajout de la formatter_class la sortie n'aurait pas le saut de ligne dans la docstring.

1voto

Mr CaT Points 99

Il s'agit de imprimer le __doc__ chaîne de caractères quand --help est le seul argument.

if __name__=='__main__':
 if len(sys.argv)==2 and sys.argv[1]=='--help':
    print(__doc__)

Il fonctionne pour les deux :

  • ./yourscriptname.py --help
  • python3 yourscriptname.py --help

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X