2017-02-18 60 views
0

Argparse具有名爲fromfile-prefix-chars的功能,該功能似乎只是我要查找的一半功能。如何從當前的命令行參數創建此功能的文件?保存python argparse文件

我有一個複雜的腳本,其中包含一個自動執行代碼構建部分的解析器。用例是第一次正確設置命令行,然後基本上用相同的參數重新運行。

使用文件並從中加載似乎是一種很好的方式來實現我所需要的。似乎缺少的是將初始命令行寫出到文件的簡單方法,以便現有文件解析能夠正常工作。

回答

3

文件格式記錄很清楚:

參數從文件中讀取默認情況下必須每行一個[...]

和代碼示例中的文檔顯示他們寫用換行文件之間:

>>> with open('args.txt', 'w') as fp: 
...  fp.write('-f\nbar') 

如果你想保存當前的命令行,只寫sys.argv[1:]到一個文件中,用換行參數之間:

with open('commandline_args.txt', 'w') as f: 
    f.write('\n'.join(sys.argv[1:])) 

演示:

>>> from argparse import ArgumentParser 
>>> import sys 
>>> parser = ArgumentParser(fromfile_prefix_chars='@') 
>>> parser.add_argument('--foo') 
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) 
>>> parser.add_argument('bar', nargs='?') 
_StoreAction(option_strings=[], dest='bar', nargs='?', const=None, default=None, type=None, choices=None, help=None, metavar=None) 
>>> sys.argv[1:] = ['--foo', 'spam', 'barbaz'] 
>>> parser.parse_args() 
Namespace(bar='barbaz', foo='spam') 
>>> with open('commandline_args.txt', 'w') as f: 
...  f.write('\n'.join(sys.argv[1:])) 
... 
17 
>>> parser.parse_args(['@commandline_args.txt']) 
Namespace(bar='barbaz', foo='spam') 
>>> sys.argv[1:] = ['--foo=spam', 'barbaz'] # using alternate syntax 
>>> parser.parse_args() 
Namespace(bar='barbaz', foo='spam') 
>>> with open('commandline_args.txt', 'w') as f: 
...  f.write('\n'.join(sys.argv[1:])) 
... 
17 
>>> parser.parse_args(['@commandline_args.txt']) 
Namespace(bar='barbaz', foo='spam') 
+0

我不認爲它就是這麼簡單。請參閱http://stackoverflow.com/a/25084994/169296。您的解決方案將標誌和標誌的值分成兩行。 –

+0

@BrettStottlemyer:是的,那很好。請注意,文檔中的代碼示例完全符合**。 –

+0

@BrettStottlemyer:注意它們也是'sys.argv'中的單獨的參數條目。你可以在'sys.argv'列表中選擇''--option = foo''(一個字符串或'' - 選項'和''foo'' –