将参数传递给python应用程序?

将参数传递给python应用程序?,python,python-3.x,command-line,terminal,argparse,Python,Python 3.x,Command Line,Terminal,Argparse,我有一个Python3应用程序,我想使用Ubuntu 18.04终端向它传递一些参数: python3 app/app.py -af app/annotation_file.json -em app/model/ -output_dir app/new_model/ -n_iter 100 我正在尝试使用argparse执行此操作: if __name__ == "__main__": from argparse import ArgumentParser

我有一个Python3应用程序,我想使用Ubuntu 18.04终端向它传递一些参数:

python3 app/app.py -af app/annotation_file.json -em app/model/ -output_dir app/new_model/ -n_iter 100
我正在尝试使用argparse执行此操作:

if __name__ == "__main__":
    from argparse import ArgumentParser

    parser = ArgumentParser()
    parser.add_argument("-af", "--annotation_file",
                        dest="main", default=None,
                        help="Path to annotated file")
    parser.add_argument("-em", "--existing_model_path",
                        dest="main", default=None,
                        help="Retrain existing model or train from scratch")
    parser.add_argument("-output_dir", "--output_dir_to_save_model",
                        dest="main", default="/app/model",
                        help="Path to save newly generated NER model")
    parser.add_argument("-n_iter", "--num_iter",
                        dest="main", default=100,
                        help="Number of iterations to train the model")

    args = parser.parse_args()
    print(args)
    main(args)
输出:

Namespace(main='100')
Namespace(main='100')
但是我没有得到输出。
如何将上述所有命名的参数传递给我的
main()
函数?

好的,那么,您将参数传递给函数是正确的,但由于您的每一个解析器行都将输入数据保存到:

dest="main"
每个新解析器的主变量都会被覆盖。添加参数行

如果main()函数有四个参数,请更改每个解析器。添加_argument()行的dest=”“行以指向不同的变量,然后使用以下命令调用main()函数:

main(args.arg1, args.arg2, args.arg3, args.arg4)
其中arg-n是每个新创建的不同变量

例如,给定您的代码:

if __name__ == "__main__":
    from argparse import ArgumentParser

    parser = ArgumentParser()
    parser.add_argument("-af", "--annotation_file",
                        dest="arg1", default=None,
                        help="Path to annotated file")
    parser.add_argument("-em", "--existing_model_path",
                        dest="arg2", default=None,
                        help="Retrain existing model or train from scratch")
    parser.add_argument("-output_dir", "--output_dir_to_save_model",
                        dest="arg3", default="/app/model",
                        help="Path to save newly generated NER model")
    parser.add_argument("-n_iter", "--num_iter",
                        dest="arg4", default=100,
                        help="Number of iterations to train the model")

    args = parser.parse_args()
    print(args)
    main(args.arg1, args.arg2, args.arg3, args.arg4)

好的,您将参数传递给函数,但是当您的每一行解析器都将输入数据保存到:

dest="main"
每个新解析器的主变量都会被覆盖。添加参数行

如果main()函数有四个参数,请更改每个解析器。添加_argument()行的dest=”“行以指向不同的变量,然后使用以下命令调用main()函数:

main(args.arg1, args.arg2, args.arg3, args.arg4)
其中arg-n是每个新创建的不同变量

例如,给定您的代码:

if __name__ == "__main__":
    from argparse import ArgumentParser

    parser = ArgumentParser()
    parser.add_argument("-af", "--annotation_file",
                        dest="arg1", default=None,
                        help="Path to annotated file")
    parser.add_argument("-em", "--existing_model_path",
                        dest="arg2", default=None,
                        help="Retrain existing model or train from scratch")
    parser.add_argument("-output_dir", "--output_dir_to_save_model",
                        dest="arg3", default="/app/model",
                        help="Path to save newly generated NER model")
    parser.add_argument("-n_iter", "--num_iter",
                        dest="arg4", default=100,
                        help="Number of iterations to train the model")

    args = parser.parse_args()
    print(args)
    main(args.arg1, args.arg2, args.arg3, args.arg4)

我将清理您的解析器定义(我删除了
dest
,并修复了短选项标志):

现在您将看到
名称空间中的所有4个参数,并且可以按名称访问它们

args.n_iter
args.output_dir
通常情况下,
dest
取自双破折号标志之一。最终将
args
传递到
main()
的事实与
argparse
无关。您向所有4个参数提供了相同的
dest
,结果只看到了其中一个参数的值,从而弄乱了解析器

如文档所述,您可以使用

vars(args)

对于可选参数操作,dest的值通常从选项字符串推断。ArgumentParser通过获取第一个长选项字符串并去掉初始的--string来生成dest的值。如果没有提供长选项字符串,dest将通过剥离初始字符从第一个短选项字符串派生


我将清理您的解析器定义(我删除了
dest
,并修复了短选项标志):

现在您将看到
名称空间中的所有4个参数,并且可以按名称访问它们

args.n_iter
args.output_dir
通常情况下,
dest
取自双破折号标志之一。最终将
args
传递到
main()
的事实与
argparse
无关。您向所有4个参数提供了相同的
dest
,结果只看到了其中一个参数的值,从而弄乱了解析器

如文档所述,您可以使用

vars(args)

对于可选参数操作,dest的值通常从选项字符串推断。ArgumentParser通过获取第一个长选项字符串并去掉初始的--string来生成dest的值。如果没有提供长选项字符串,dest将通过剥离初始字符从第一个短选项字符串派生


中没有特殊的
main
python@MadPhysicist我的代码中有一个main()函数。我想把终端的参数传递给它,然后显示出来。请记住,
dest
是每个选项最终所在的名称空间中的变量。我不知道你为什么把它们都叫做
main
。可能会删除
dest='main'
部分?请显示MCVE。我基本上已经回答了你的问题。在中没有特殊的
main
python@MadPhysicist我的代码中有一个main()函数。我想把终端的参数传递给它,然后显示出来。请记住,
dest
是每个选项最终所在的名称空间中的变量。我不知道你为什么把它们都叫做
main
。可能会删除
dest='main'
部分?请显示MCVE。我基本上回答了你的问题。