Python 通过命令行传递可变数量的必需参数和可选参数

Python 通过命令行传递可变数量的必需参数和可选参数,python,sys,Python,Sys,我在通过命令行调用的python脚本中有一个用户定义的函数。此函数中有3个必需参数和3个可选参数 因此函数定义如下所示: def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100): python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50 python script.py 'csvFile.csv' 'path/to/di

我在通过命令行调用的python脚本中有一个用户定义的函数。此函数中有3个必需参数和3个可选参数

因此函数定义如下所示:

def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100):
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' rp=50
当我调用CL上的函数时,我可以设置也可以不设置后三个输入变量。要使用这些输入调用此函数,现在我有:

if __name__ == '__main__':
    import sys
    main(sys.argv[1], sys.argv[2], sys.argv[3])
但是如果我想设置rp=50,那么这个调用就忽略了那个参数。 但是,如果我转到sys.argv[6],如果我没有指定其他3个可选参数,这将失败

除了下面的块之外,还有更好的方法向主函数提供这些参数吗

if __name__ == '__main__':
    import sys

    if len(sys.argv) == 4: # i.e. 3 arguments are supplied
        main(sys.argv[1], sys.argv[2], sys.argv[3])

    if len(sys.argv) == 5: # i.e. 4 arguments are supplied
        main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])

    if len(sys.argv) == 6: # i.e. 5 arguments are supplied
        main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])

    if len(sys.argv) == 7: # i.e. 6 arguments are supplied
        main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6])
另外,如果我从命令行调用脚本(使用上面的if语句),如下所示:

def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100):
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' rp=50
当我在主功能中“print rp”时,它返回'rp=50'。我认为在函数定义中设置rp=100表示rp是一个可选参数,默认值为100,显式调用“rp=50”应该覆盖默认值并将rp设置为50,而不是“rp=50”

最后,当我这样调用脚本时:

def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100):
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' rp=50
变量mapprj设置为'rp=50',doP2D根据默认值为真,rp保持默认值100。我认为上面的调用应该保留mapprj和doP2D作为它们的默认真值,并将rp设置为50,因为我显式地将其设置为50

我做错了什么


谢谢

通过解析命令行中的参数,使所有位置参数都成为必需的参数,只需解压缩解析参数的dict并将其传递给函数:

import argparse


if __name__ == '__main__': 
    ap = argparse.ArgumentParser()
    ap.add_argument("-c", "--csv", required=True, help = "filename")
    ...
    kwargs = vars(ap.parse_args())
    main(**kwargs)

你要找的是一个名为
argparse
谢谢你的模块,摩西。我尝试过这样做(用-incsv替换-c),但一直得到TypeError:main()得到了一个意外的关键字参数“incsv”。。。。你知道这是怎么回事吗?没关系。我绕过了这个问题,但现在即使我提供了一个可选参数,而不是它的默认值,它仍然不会覆盖默认值。如果我的一个参数是这样添加的:ap.add_参数(“-mapprj”,default=True,type=bool,如果我用3个必需的值加上-mapprj=False或-mapprj False调用函数,它仍然作为True传递。知道为什么吗?这只适用于mapprj和doP2D,它们是布尔值。设置rp实际上是有效的。但是,如果我将默认值设置为False,然后在CL中将其设置为True,这确实有效。为什么不是另一种方式,我如何解决这个问题呢?抱歉,所有的评论都是针对响应的。我应该提到这一点,但我确实做了type=boolb最有效的方法似乎是使用action='store\u true',这意味着bool变量默认为False,除非在命令行调用它,即-mapprj.Thx!