我有兩個定義的命令(爲簡潔起見,我省略瞭解析器/子分析器部分,因爲我認爲他們不需要回答問題)。Python argparse組合命令和命令參數
#COMMAND ARGS: Add Arguments to the final command "sacs am run [args]"
am_run_parser.add_argument("-s", action='store_const', const='s', dest='s', help="Output statistical reporting to the console.")
am_run_parser.add_argument("-S", action='store_const', const='S', dest='S', help="Output statistical reporting to the standard archive.")
am_run_parser.add_argument("-t", action='store_const', const='t', dest='t', help="Output timing reporting to the console.")
am_run_parser.add_argument("-T", action='store_const', const='T', dest='T', help="Output timing reporting to the standard archive.")
am_run_parser.add_argument("-R", action='store_const', const='R', dest='R', help="Output reject reporting to the standard archive.")
am_run_parser.add_argument("-b", "--bulk", type=int, nargs=1, help="MySQL Bulk Insert Quantity. Currently the default is set at " + str(defaults.bulk) + ". Theoretically, changing this value can affect how quickly inserts are performed.")
am_run_parser.add_argument("-host", nargs=1, help="The MySQL server host to output to.")
am_run_parser.add_argument("-port", nargs=1, help="The MySQL server port to output to.")
am_run_parser.add_argument("-user", nargs=1, help="The MySQL server username to use.")
am_run_parser.add_argument("-pw", nargs=1, help="The MySQL server password to use.")
am_run_parser.add_argument("-db", nargs=1, help="The MySQL server database to use.")
am_run_parser.set_defaults(func=am_cli_tools.am_run)
#COMMAND ARGS: Add Arguments to the final command "sacs am get [args]"
am_get_parser.add_argument("-a", action='store_const', const='a', dest='a', help="Get source A data for sacs am processing.")
am_get_parser.add_argument("-b", action='store_const', const='b', dest='b', help="Get source B data for sacs am processing.")
am_get_parser.add_argument("-c", action='store_const', const='c', dest='c', help="Get source C data for sacs am processing.")
am_get_parser.add_argument("-r", action='store_const', const='r', dest='r', help="Get source D data for sacs am processing.")
am_get_parser.add_argument("-t", action='store_const', const='t', dest='t', help="Get source E data for sacs am processing.")
am_get_parser.add_argument("-R", action='store_const', const='t', dest='t', help="Run the sacs am processor using the arguments specified after the run_args flag. This will perform the 'sacs am run' command after all specified sources are gathered (review the help file for this command for additional information about argument options).")
am_get_parser.set_defaults(func=am_cli_tools.am_get)
正如你所看到的,我在加-R參數的囊的過程中我得到的命令。基本上,我希望能夠告訴囊在完成後運行囊運行命令,並且我想公開所有運行囊的相關參數。例如sacs am get -abcrt R -run_args -sStTRb -host www.google.com -port 22 -user IBUser -pw IBpass -db IBpoken(lol)。
當然,這些run_args只適用於-R參數。
我懷疑有更好的方法來解決這個問題。所有選項都在桌面上。這些命令在運行時(通常通過cron作業)確實需要發送電子郵件;這是我想要選擇合併命令的主要原因之一,因爲如果我不這樣做,我將不得不發送2封電子郵件,因爲這些命令必須單獨運行。我想我可以做一些其他的事情,比如寫/追加到一個文件中,併爲cron創建另一個sac am sendemail命令來運行......但是這種方法會使事情更加有序和簡潔。
第三個命令'sacs am full'具有get'和'run'的所有參數嗎?您可以組織字典中的所有參數,並將它們添加到循環中的適當分析器中,以避免重複。 –
我曾考慮過將gesun加入囊中,然後讓相關函數調用am_get和am_run;我還會爲原來的2個命令添加-e參數,以便有選擇地發送電子郵件,以防止用戶在單獨運行這些電子郵件時仍想要。我用這種方法看到的唯一真正的問題是,我目前有一些參數重疊,需要更改一些字母作爲新命令,這可能會混淆用戶,如果他們使用了他們習慣的而不是幫助文件說,它可能會導致一些真正的問題......變量名稱是理想的。 – gunslingor
如果參數重疊可能導致真正的問題,通過重命名重疊的兩個版本(例如,使用前綴「--get-x」)很容易避免它們。他們會因爲使用錯誤的參數而出錯,並且沒有使用錯誤的參數運行的風險。當然,這並不能解決用戶體驗的問題,儘管它們將始終使用新的界面。 –