2016-03-08 19 views
4

我寫了下面的代碼。如何在argparse版本輸出中保留換行符,同時讓argparse自動格式化/換行剩餘的幫助消息?

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-v', '--version', action='version', 
        version='%(prog)s 1.0\nCopyright (c) 2016 Lone Learner') 
parser.parse_args() 

這會產生以下輸出。

$ python foo.py --version 
foo.py 1.0 Copyright (c) 2016 Lone Learner 

您可以看到換行符丟失。我希望版權聲明出現在下一行。

如何保留版本輸出消息中的新行?

我還想要argparse來計算python foo.py -h的輸出應該如何與所有自動換行一起佈置。但是我希望版本輸出是一個多行輸出,並且換行符保持不變。

回答

2

RawTextHelpFormatter將關閉自動換行,允許您顯式顯示\n。但它會影響所有help線路。沒有辦法選擇和選擇。要麼接受默認包裝,要麼在所有幫助行中添加明確的換行符。

對於您自己需要學習HelpFormatter代碼的幫助格式,您正在達到一定的挑剔程度。

+0

謝謝。我查看了'HelpFormatter',並在它的docstring中發現了以下內容:「只有這個類的名稱才被認爲是一個公共API。該類提供的所有方法都被視爲一個實現細節。」所以我想如果我想確保我的代碼能夠在未來版本的Python中繼續運行,依靠「HelpFormatter」的實現並不是一個好主意。我想我必須接受'argparse'的限制並在其中工作,或者自己處理'sys.argv'。 –

+0

不要太擔心這個免責聲明。如果您需要/想要編寫自己的格式化程序子類,請執行此操作。五年後,當重寫主要課程進入生產時,您可以根據需要調整您的子類。同時,您的代碼將按照您的要求執行。 – hpaulj

1

爲此,您最好使用自定義argparse.Action

import argparse 
import os 
import sys 

class MultilineVersionAction(argparse.Action): 
    verbose_version = '1.0\nCopyright (c) 2016 Lone Learner' 

    def __init__(self, option_strings, dest, nargs=None, **kwargs): 
     if nargs is not None: 
      raise ValueError('nargs not allowed') 
     # this is how argparse initialises `prog` by default 
     self.prog = os.path.basename(sys.argv[0]) 
     super(MultilineVersionAction, self).__init__(option_strings, dest, nargs=0, **kwargs) 

    def __call__(self, parser, namespace, values, option_string=None): 
     parser.exit(message='{} {}\n'.format(self.prog, self.verbose_version)) 

# ... 

    self.parser.add_argument('-v', '--version', action=MultilineVersionAction) 
0

只是不要使用action='version'-h可以重複相同的模式。

import os 
import sys 
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-v', '--version', action='store_true') 
args = parser.parse_args() 

if args.version: 
    prog = os.path.basename(__file__) 
    print('{} 1.0\nCopyright (c) 2016 Lone Learner'.format(prog)) 
    sys.exit() 
0

還有argparse.RawDescriptionHelpFormatter

parser=argparse.ArgumentParser(add_help=True, 
    formatter_class=argparse.RawDescriptionHelpFormatter, 
    description="""an 
already-wrapped 
description 
string""") 

它的葉子descriptionepilog獨自一人,幷包裝唯一參數幫助字符串。 OP想要相反。