Wie kann ich die Dokumentzeichenfolge einer Python-Datei drucken, wenn ich sie ausführe?

75

Ich habe ein Python-Skript mit einer Dokumentzeichenfolge. Wenn das Parsen der Befehlszeilenargumente nicht erfolgreich ist, möchte ich die Dokumentzeichenfolge für die Benutzerinformationen drucken.

Gibt es eine Möglichkeit, dies zu tun?

Minimales Beispiel

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

This describes the script.
"""

import sys


if len(sys.argv) < 2:
    print("<here comes the docstring>")
thias
quelle
1
Es gibt Bibliotheken für das Parsen von cmdline-Argumenten: argparse (> = 2.7) und optparse. docs.python.org/dev/library/argparse.html docs.python.org/dev/library/optparse.html
codeape
10
Ich weiß das, aber es ist nicht relevant für die Frage
Thias

Antworten:

90

Die Dokumentzeichenfolge wird im __doc__globalen Modul gespeichert .

print(__doc__)

Dies gilt übrigens für jedes Modul : import sys; print(sys.__doc__). Dokumentzeichenfolgen von Funktionen und Klassen sind ebenfalls in ihrem __doc__Attribut enthalten.

Petr Viktorin
quelle
2
Das funktioniert definitiv, aber es gibt eine andere Möglichkeit, die eine nativ aussehende Modul-Hilfeschnittstelle zeigt :: help(module_name)nachdem Sie dieses Modul importiert haben.
Danbgray
1
@ Danbgray Ich denke, was Sie bekommen, ist, wofür Argparse verwendet wird
Jamescampbell
13

Hier ist eine Alternative, die den Dateinamen des Skripts nicht fest codiert, sondern stattdessen sys.argv [0] zum Drucken verwendet. Die Verwendung von% (scriptName) s anstelle von% s verbessert die Lesbarkeit des Codes.

#!/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)
wint3rschlaefer
quelle
Vielen Dank. Normalerweise habe ich eine usage () -Funktion, die sys.argv [0] verwendet, die vor dem Drucken der Dokumentzeichenfolge aufgerufen wird.
Thias
@ wint3rschlaefer, kannst du erklären, wie Usage:% (scriptName) den Skriptnamen erhält? Wie heißt dieser Mechanismus in Python?
Olala
1
@ wint3rschlaefer Vielleicht lohnt es sich, mit einer Python3-Version zu aktualisieren, wie """Usage: {scriptName}""".format(scriptName = sys.argv[0])
Cimbali
11

Das Parsen von Argumenten sollte immer mit durchgeführt werden argparse.

Sie können die __doc__Zeichenfolge anzeigen, indem Sie sie an den descriptionParameter Argparse übergeben:

#!/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)

Wenn Sie diese mysuperscript.py aufrufen und ausführen, erhalten Sie:

$ ./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
Martin Thoma
quelle
0

Dadurch wird die __doc__Zeichenfolge gedruckt, wenn dies --helpdas einzige Argument ist.

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

Funktioniert für beide:

  • ./yourscriptname.py --help
  • python3 yourscriptname.py --help
Herr CaT
quelle