为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2023-09-02 16:21:59
我有一个 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()函数?
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

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


dest="main"

对于每个新的 parser.add_argument 行,您的 main 变量都会被覆盖。


如果您的 main() 函数采用四个参数,请将每个 parser.add_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)


查看完整回答
反对 回复 2023-09-02
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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


parser = ArgumentParser()

parser.add_argument("-a", "--af", "--annotation_file",

                    help="Path to annotated file")

parser.add_argument("-e", "--em", "--existing_model_path",

                    help="Retrain existing model or train from scratch")

parser.add_argument(+-o", "--output_dir", "--output_dir_to_save_model",

                    default="/app/model",

                    help="Path to save newly generated NER model")

parser.add_argument("-n", "--n_iter", "--num_iter",

                    default=100,

                    help="Number of iterations to train the model")


args = parser.parse_args()

print(args)

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


args.n_iter

args.output_dir

通常,它dest取自双破折号标志之一。args您最终将转到的事实main()与 无关argparse。您为所有 4 个参数提供相同的参数,搞乱了解析器dest,结果您只看到其中一个的值。


如文档所述,您可以轻松获得字典版本


vars(args)

https://docs.python.org/3/library/argparse.html#dest


对于可选参数操作,dest 的值通常是从选项字符串推断出来的。ArgumentParser 通过获取第一个长选项字符串并去掉初始的 -- 字符串来生成 dest 的值。如果未提供长选项字符串,则 dest 将从第一个短选项字符串中删除首字母 - 字符得出。


查看完整回答
反对 回复 2023-09-02
  • 2 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信