通过命令行传递可变数量的必需和可选参数
passing variable number of required and optional arguments through command line
我在通过命令行调用的 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 个可选参数,这将失败。
除了以下代码块之外,是否有更好的方法将这些参数提供给主函数?
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
当我在 main 函数中 "print 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。
我做错了什么?
谢谢
通过argparse
从命令行解析参数,使所有位置参数成为必需的,然后简单地解压解析参数的字典并将其传递给您的函数:
import argparse
if __name__ == '__main__':
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--csv", required=True, help = "filename")
...
kwargs = vars(ap.parse_args())
main(**kwargs)
我在通过命令行调用的 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 个可选参数,这将失败。
除了以下代码块之外,是否有更好的方法将这些参数提供给主函数?
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
当我在 main 函数中 "print 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。
我做错了什么?
谢谢
通过argparse
从命令行解析参数,使所有位置参数成为必需的,然后简单地解压解析参数的字典并将其传递给您的函数:
import argparse
if __name__ == '__main__':
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--csv", required=True, help = "filename")
...
kwargs = vars(ap.parse_args())
main(**kwargs)