通过命令行

时间:2017-02-13 18:26:40

标签: python sys

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

所以函数定义如下所示:

def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100):

当我在CL上调用函数时,我可能会也可能不会设置后三个输入变量。要使用这些输入调用此函数,现在我有:

if __name__ == '__main__':
    import sys
    main(sys.argv[1], sys.argv[2], sys.argv[3])

但是说我想设置rp = 50,那么这个调用错过了那个参数。 但是,如果我进入sys.argv [6],如果我没有指定其他3个可选参数,这将失败。

除了以下块之外还有更好的方法将这些参数提供给main函数吗?

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语句),如下所示:

python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50

当我"打印rp"在主要功能中,它返回' rp = 50'。我认为在函数定义中设置rp = 100表示​​rp是一个可选参数,其默认值为100,并且显式调用" rp = 50"应该覆盖默认值并将rp设置为50,而不是" rp = 50"

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

python script.py 'csvFile.csv' 'path/to/directory' 'batchName' rp=50

变量mapprj被设置为' rp = 50',doP2D根据默认值为True,而rp保持默认值100.我认为上面的调用应该保持将mapprj和doP2D作为默认的True值,并将rp设置为50,因为我明确将其设置为50。

我做错了什么?

由于

1 个答案:

答案 0 :(得分:1)

通过argparse从命令行解析参数,使所有位置参数成为必需,并简单地解压缩解析的args的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)