¿Cómo puedo imprimir la cadena de documentación de un archivo de Python al ejecutarlo?

4 minutos de lectura

avatar de usuario
tias

Tengo un script de Python con una cadena de documentación. Cuando el análisis de los argumentos de la línea de comandos no tiene éxito, quiero imprimir la cadena de documentación para la información del usuario.

¿Hay alguna manera de hacer esto?

Ejemplo mínimo

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

This describes the script.
"""

import sys


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

  • Hay bibliotecas para el análisis de argumentos de cmdline: argparse (>=2.7) y optparse. docs.python.org/dev/library/argparse.html docs.python.org/dev/library/optparse.html

    – código de copia

    17/10/2011 a las 11:37

  • Lo sé, pero no es relevante para la pregunta.

    – thías

    17 de octubre de 2011 a las 11:38

  • Soy una persona que a veces hace explícitamente no quiero usar argparse para una secuencia de comandos realmente simple, por lo que agradezco a quienes respondieron la pregunta a continuación.

    – SteveWithamDuplicate

    24 de junio de 2021 a las 18:04

avatar de usuario
petr viktorin

El docstring se almacena en el módulo __doc__ global.

print(__doc__)

Por cierto, esto vale para cualquier módulo: import sys; print(sys.__doc__). Las cadenas de documentos de funciones y clases también están en su __doc__ atributo.

  • Eso definitivamente funciona, pero hay otra forma que muestra una interfaz de ayuda del módulo con un aspecto más nativo: help(module_name) después de importar ese módulo.

    – danbgray

    3 mayo 2016 a las 14:33


  • @danbgray Creo que a lo que te refieres es para lo que se usa argparse

    – james campbell

    18 de marzo de 2019 a las 16:29

  • ARRUGAS EXTRAÑAS DE PYTHON 2: si coloca, por ejemplo, “from __future__ import print_function” antes de la cadena de documentación, ya no es una cadena de documentos. Pero puedes poner la importación “desde __futuro__”… justo después de la cadena de documentación, y la regla “desde __futuro__ las importaciones deben ocurrir al principio del archivo” todavía se cumple.

    – SteveWithamDuplicate

    24 de junio de 2021 a las 17:59


avatar de usuario
Martín Tomas

El análisis de argumentos siempre debe hacerse con argparse.

Puede mostrar la __doc__ cadena pasándola al description parámetro 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 llamas a esto misuperíndice.py y ejecutarlo se obtiene:

$ ./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

Aquí hay una alternativa que no codifica el nombre de archivo del script, sino que usa sys.argv[0] para imprimirlo El uso de %(scriptName)s en lugar de %s mejora la legibilidad del código.

#!/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("https://stackoverflow.com/")[-1]}
   sys.exit(0)

  • Gracias. Normalmente tengo una función de uso () que usa sys.argv[0] que se llama antes de imprimir la cadena de documentación.

    – thías

    25 de febrero de 2013 a las 9:59

  • @wint3rschlaefer, ¿podría explicar cómo Usage: %(scriptName)s obtiene el nombre del script? ¿Cómo se llama este mecanismo en Python?

    – olala

    24/01/2016 a las 16:40

  • @ wint3rschlaefer Tal vez valga la pena actualizar con una versión de python3, como """Usage: {scriptName}""".format(scriptName = sys.argv[0])

    – Cimbalí

    9 de agosto de 2016 a las 10:38


  • ¿Qué hay de usar _nombre ?

    – Otzen

    5 de febrero de 2021 a las 22:16

avatar de usuario
Señor Gato

Esta voluntad imprimir el __doc__ cuerda cuando --help es el único argumento.

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

Funciona para ambos:

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

Una mejora de la respuesta de @MartinThoma para que imprima cadenas de documentos de varias líneas inspiradas en Python argparse: ¿Cómo insertar una nueva línea en el texto de ayuda?

El análisis de argumentos siempre debe hacerse con argparse.

Puede mostrar la doc cadena pasándola al parámetro de descripción 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 llama a esto mysuperscript.py y lo ejecuta, obtiene:

$ ./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

Sin la adición de la formatter_class la salida no tendría el salto de línea en la cadena de documentación.

¿Ha sido útil esta solución?