2015-04-13 18 views
6

Ich verwende argparse in Python2.7 und ich möchte mehrere Zeilen im Hilfetext eines Arguments anzeigen.Mehrere Zeilen in Python argparse Hilfe Anzeige

Aussehen Meine Codes wie folgt aus:

import argparse 

parser = argparse.ArgumentParser(description='details', 
     usage='use "%(prog)s --help" for more information') 

parser.add_argument('--argument', default=None, type=sometype, 
     help=''' 
      First line \n 
      Second line \n 
      \n 
      More lines \n 
      ''') 

ich es möchte die Hilfe-Nachricht in mehrere Zeilen drucken, wenn --help aufrufen. Die Ausgabe sieht jedoch wie folgt aus.

First line Second line More lines 

Ich weiß, dass ich durch Aufsummierung die Saiten jeder Zeile das Problem lösen könnte.

parser.add_argument('--argument', default=None, type=sometype, 
     help='First line \n' + 
      'Second line \n' + 
      '\n'    + 
      'More lines') 

Aber es gibt Dutzende von Zeilen, die ich zum Hilfetext hinzufügen möchte. Ich frage mich, gibt es eine bequeme Möglichkeit, den Hilfetext in mehrere Zeilen aufzuteilen?

Und es scheint auch, dass es eine obere Grenze der Anzahl der Zeichen gibt, die in einer Zeile in der Hilfe-Nachricht angezeigt werden können, die 54 in meinem Fall ist. Ist dieses Limit systemabhängig und gibt es eine Möglichkeit, die Obergrenze zu erhöhen?

+1

Argarse löscht Zeilenumbrüche absichtlich, da es den Text basierend auf der Terminalgröße umgruppiert. –

+0

Ich sehe, so ist die Obergrenze für die Anzahl der Zeichen in jeder Zeile systemabhängig. –

+0

Mögliches Duplikat von [Python argparse: Wie fügt man Newline in den Hilfetext ein?] (Http://stackoverflow.com/questions/3853722/python-argparse-how-to-insert-newline-in-the-help-text) –

Antwort

9

Die Standard Hilfe Formatierer wieder Wraps Linien Terminal passen (es sieht aus an der Umgebungsvariable COLUMNS, um die Ausgabebreite zu bestimmen, standardmäßig auf 80 Zeichen insgesamt).

Vom formatter_class section:

standardmäßig ArgumentParser Objekte Line-wickeln, die Beschreibung und Epilog Texte in Kommandozeilen-Hilfemeldungen.

die RawTextHelpFormatter Klasse Verwenden Sie stattdessen, um anzuzeigen, dass Sie bereits die Linien eingewickelt:

RawTextHelpFormatter Leerzeichen unterhält für alle Arten von Hilfetext, einschließlich Argument Beschreibungen.

für Ihren Code, der wie folgt aussehen würde:

parser = argparse.ArgumentParser(description='details', 
     usage='use "%(prog)s --help" for more information', 
     formatter_class=argparse.RawTextHelpFormatter) 

Sie zu viele Zeilenumbrüche nicht hinzufügen Sie achten; Strings mit drei Anführungszeichen enthalten die Zeilenumbrüche, die Sie in der Zeichenfolge hinterlassen. Als solche brauchen Sie die nicht \n Zeichen:

>>> import argparse 
>>> parser = argparse.ArgumentParser(description='details', 
...   usage='use "%(prog)s --help" for more information', 
...   formatter_class=argparse.RawTextHelpFormatter) 
>>> parser.add_argument('--argument', default=None, 
...   help=''' 
...    First line 
...    Second line 
... 
...    More lines 
...    ''') 
_StoreAction(option_strings=['--argument'], dest='argument', nargs=None, const=None, default=None, type=None, choices=None, help='\n    First line\n    Second line\n\n    More lines\n    ', metavar=None) 
>>> parser.print_help() 
usage: use " --help" for more information 

details 

optional arguments: 
    -h, --help   show this help message and exit 
    --argument ARGUMENT 
            First line 
            Second line 

            More lines 
+0

RawTextHelpFormatter funktioniert! :) –

-2

Die einfachste, was man die Zeilen in einem Array platzieren sein tun würde, könnte und sich dann wie so mit Zeilenumbrüchen kommen:

help_lines = ['First line', 'Second line', '', 'More lines'] 
# ... 
parser.add_argument('--argument', default=None, type=sometype, 
help='\n'.join(help_lines)) 
+5

Dies ergibt immer noch den exakt gleichen Stringwert *. Das liegt daran, dass die Zeilenumbrüche durch den Hilfeformatierer absichtlich entfernt werden. –

5

Eine weitere einfache Möglichkeit, es zu tun ist textwrap aufzunehmen.

Zum Beispiel

import argparse, textwrap 
parser = argparse.ArgumentParser(description='Prepare input file', 
     usage='use "python %(prog)s --help" for more information', 
     formatter_class=argparse.RawTextHelpFormatter) 

parser.add_argument('--argument', default=somedefault, type=sometype, 
     help= textwrap.dedent('''\ 
     First line 
     Second line 
     More lines ... 
     ''')) 

Auf diese Weise können wir den langen leeren Raum vor jeder Ausgangsleitung vermeiden.

usage: use "python your_python_program.py --help" for more information 

Prepare input file 

optional arguments: 
-h, --help   show this help message and exit 
--argument ARGUMENT 
         First line 
         Second line 
         More lines ...