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>")
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
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
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.
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