在 Python 腳本中獲取命令行參數的最佳方法

vish4071

在我的 Python 腳本中,我有很多命令行參數。其中一些是強制性的,而另一些則是可選的。對於強制參數的某些值,一些可選也是強制的。在這種命令行參數的情況下,最好的方法是什麼。我正在argparse.Argumentparser為我的目的使用。

為了闡明用例,這裡有一個例子。假設我有 3 個強制參數:mode, foo, bar和 5 個可選參數:op1, op2, op3, op4, op5mode可以說,可以有 3 個值:m1, m2, m3. 如果modem1則為op1 and op2必填項。如果modem2op3則是強制性的,如果modem3op4 and op5則是強制性的。

將其放入代碼的最佳方法是什麼?我現在所做的似乎過於詳盡,只是覺得必須有更好的方法來做到這一點。

-> 當前代碼

import argparse

# create and execute parser
my_parser = argparse.ArgumentParser(description="Demo")
my_parser.add_argument("--mode", action="store", type=str, required=True)
my_parser.add_argument("--foo", action="store", type=str, required=True)
my_parser.add_argument("--bar", action="store", type=str, required=True)
my_parser.add_argument("--op1", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op2", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op3", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op4", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op5", action="store", type=str, required=False, default=None)
args = my_parser.parse_args()
try:
    if args.mode == "m1":
        op1 = args.op1.lower()
        op2 = args.op2.lower()
    if args.mode == "m2":
        op3 = args.op3.split(',')
    if args.mode == "m3":
        op4 = args.op4.lower()
        op5 = args.op5.lower()
except AttributeError:
    print("Wrong mode set for optional arguments")
    exit()

如您所見,即使這個示例在美學上也只是“看起來”很糟糕(尤其是try塊解析),並且在我的情況下我有很多可選參數需要處理。任何幫助都感激不盡。

此外,這種方法並沒有完全強制用戶輸入,例如,op1 and op2如果他的mode=m1. 如果也有可能做這樣的事情,那對我來說將是額外的好處。

謝謝。

揚·維拉莫夫斯基

您的程序似乎正在處理多個不同的任務。支持這一點的方法是將您的解析器拆分為子命令

import argparse

parser = argparse.ArgumentParser(description="Demo")
parser.add_argument("--foo", required=True)
parser.add_argument("--bar", required=True)
subparsers = parser.add_subparsers(dest='mode', required=True)

m1_parser = subparsers.add_parser('m1', help='mode 1')
m1_parser.add_argument("--op1", required=True)
m1_parser.add_argument("--op2", required=True)
m1_parser.add_argument("--op3")
m1_parser.add_argument("--op4")
m1_parser.add_argument("--op5")

m2_parser = subparsers.add_parser('m2', help='mode 2')
m2_parser.add_argument("--op1")
m2_parser.add_argument("--op2")
m2_parser.add_argument("--op3", required=True)
m2_parser.add_argument("--op4")
m2_parser.add_argument("--op5")

m3_parser = subparsers.add_parser('m3', help='mode 3')
m3_parser.add_argument("--op1")
m3_parser.add_argument("--op2")
m3_parser.add_argument("--op3")
m3_parser.add_argument("--op4", required=True)
m3_parser.add_argument("--op5", required=True)

args = parser.parse_args()

if args.mode == 'm1':
    print(args.op1) # it will always exist

用法:

$ python3 args.py m1
usage: args.py m1 [-h] --op1 OP1 --op2 OP2 [--op3 OP3] [--op4 OP4] [--op5 OP5]
args.py m1: error: the following arguments are required: --op1, --op2

雖然這似乎是重複的,但您現在可以選擇為特定於子命令的各種選項提供更好的名稱。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

從另一個腳本運行一個 python 腳本,其中命令行參數具有可執行文件

從命令行反彙編 Python 腳本?

在命令行/批處理文件/python 腳本中運行 java 主類

在 Python 中從命令行生成組合後獲取文件的聯合

python 包中的命令行腳本:它們在 Windows 機器上工作還是只在 Linux 上工作?

Python:從解析的參數中捕獲環境變量的最佳方法?

分发python命令行工具的最佳方法是什么?

哪一种是允许在Python命令行中覆盖配置选项的最佳方法?

使用命令行參數從 Python 運行 C 可執行文件

Ansible 忽略 ansible_python_interpreter 作為命令行參數

Powershell 將腳本中的參數與在命令行中輸入的參數組合在一起?

如何從 R 獲取 Python 腳本

将文件x中指定的函数作为命令行参数传递给python中的文件y的最佳方法

Bash - 用於從解釋器路徑獲取 Python 站點包路徑的命令/腳本

如何在python中獲取xgb.train的超參數

通過 Node.js 執行 bash 腳本並包含命令行參數

--debug Python中的命令行参数

python程序在命令行中停止

Python中的命令行输入问题

Python中的迭代命令行参数

在Python中执行cURLs命令行

在命令行中运行 Python

在命令行中运行python函数

Python中的命令行图形

Python中的命令行参数

在python中运行复杂的命令行

python中的多线程命令行

在 python 中打印命令行参数

如何在 jupyter notebook 上調用帶有解析參數的 python 腳本