如何在argparse中使用子命令以及可选的位置参数



下面的脚本打印输出并根据命令行参数打开网页。

#main.py
import os, numpy
import argparse
import webbrowser
new=2
def main():
parser = argparse.ArgumentParser() 
parser.add_argument('-i','--input',type=str, help='Choose input')
parser.add_argument('-d','--display',dest='disp',type=str, help='Opens a webpage', default=None)
args = parser.parse_args()

if args.input == 'infile':
print('This is input file')
if args.disp == 'openbrowser':
url = "https://stackoverflow.com/"
webbrowser.open(url,new=new,autoraise=True)

if __name__=='__main__':
main()

如果我使用以下命令:

python3 main.py --input infile --display openbrowser

达到期望的输出。但是,我希望--display(理想情况下没有任何str)与--input一起作为子命令进行解析,而不是作为单独的可选标志参数-d。标志-display只在--input被用作主标志时使用,甚至--display本身也应该是可选的,而不应该是强制性的。

所以我希望命令行参数看起来像:

python3 main.py --input infile --display

打印This is input file并在浏览器中打开网页。和

python3 main.py --input infile 

只输出This is input file

您正在寻找参数规范上的action='store_true'属性。https://docs.python.org/3/library/argparse.html行动

parser.add_argument('-d', '--display', dest='disp',
action='store_true', help='Opens a webpage')
#main.py
import os, numpy
import argparse
import webbrowser
new=2
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-i','--input',type=str, help='Choose input')
parser.add_argument('-d','--display',dest='disp', action='store_true', help='Opens a webpage')
args = parser.parse_args()
if args.input == 'infile':
print('This is input file')
if args.disp:
url = "https://stackoverflow.com/"
webbrowser.open(url,new=new,autoraise=True)
if __name__=='__main__':
main()

这应该是你正在寻找的。

为了添加子命令,您可以使用ArgumentParser.add_subparsers方法,该方法不需要参数,并返回一个对象,可以创建任意多的子命令。

import os, numpy
import argparse
import webbrowser
new=2
def main():
parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers()
input_parser = subparsers.add_parser("input")
input_parser.add_argument('filename', help='path to file')
args = parser.parse_args()
input_parser.add_argument(
'-d',
'--display',
dest='disp', 
action='stor_true',  
help='Opens a webpage'
)
if 'filename' in args:
print('This is input file')
if args.disp:
url = "https://stackoverflow.com/"
webbrowser.open(url,new=new,autoraise=True)

if __name__=='__main__':
main()

相关内容

  • 没有找到相关文章

最新更新