如果给定null参数,如何处理sys.argv

时间:2019-08-05 13:07:48

标签: python arguments

在脚本中使用sys.argv遇到这种情况。

该脚本包括几个对数据集进行分类,构建和转换的函数,没什么大不了的。

在脚本的开头,我根据参数将外部参数分配给2或3个变量。

if len(sys.argv) > 2:
    nfcv=sys.argv[1]
    pgrid = [int(x) for x in sys.argv[2].split(",")]
    refit =  sys.argv[3]
else:
    nfcv=sys.argv[1]
    pgrid = [int(x) for x in sys.argv[2].split(",")]
    refit =  ""

在命令行下面运行带有所有3个arg的脚本。

OC_run_eval_ML.py 5 "2,4,6,8,10,12,14" y

在脚本执行期间,仅当3参数=“ y”,如果为空则通过,我想将我的分类器放在下面

下面是我做的

def fit(X,y):
    clf.fit(X, y)

if refit == "y" :
    fit(X_train_std,y_train)
else: pass

没有第3个参数(这意味着我不想“拟合”我的模型)

OC_run_eval_ML.py 5 "2,4,6,8,10,12,14"

我收到以下错误消息:

Traceback (most recent call last):
  File "OC_run_eval_ML.py", line 25, in <module>
    refit =  sys.argv[3]
IndexError: list index out of range

似乎不接受以下条件:“ len(sys.argv)> 2:”

欢迎提供帮助。

谢谢。

Rgds

2 个答案:

答案 0 :(得分:0)

sys.argv列表始终包含脚本名称作为第一个参数,因此当您有3个命令行参数时,sys.argv的长度将为 4 个元素。如果也只有3个元素,则len(sys.argv) > 2是正确的。

测试3个或更多:

if len(sys.argv) > 3:
    nfcv=sys.argv[1]
    pgrid = [int(x) for x in sys.argv[2].split(",")]
    refit =  sys.argv[3]
else:
    nfcv=sys.argv[1]
    pgrid = [int(x) for x in sys.argv[2].split(",")]
    refit =  ""

您可以将其简化为:

nfcv = sys.argv[1]
pgrid = [int(x) for x in sys.argv[2].split(",")]
if len(sys.argv) > 3:
    refit =  sys.argv[3]
else:
    refit =  ""

我个人会使用argparse library为您完成这项工作,或者(对于更复杂的项目)使用click

Argparse示例:

import argparse

parser = argparse.ArgumentParser(description='Classify, build and transform a dataset')
parser.add_argument("nfcv", help="The NFCV argument...")
parser.add_argument("pgrid", 
    help="Comma-separated pgrid values",
    type=lambda v: [int(x) for x in v.split(",")]
)
parser.add_argument("refit", nargs="?", default="", help="The refit argument...")

args = parser.parse_args()

然后在代码中使用args.nfcvargs.pgridargs.refit

演示:

$ cat demo.py
import argparse

parser = argparse.ArgumentParser(description='Classify, build and transform a dataset')
parser.add_argument("nfcv", help="The NFCV argument...")
parser.add_argument("pgrid",
    help="Comma-separated pgrid values",
    type=lambda v: [int(x) for x in v.split(",")]
)
parser.add_argument("refit", nargs="?", default="", help="The refit argument...")

args = parser.parse_args()

print(f"NFCV:  {args.nfcv!r}")
print(f"prid:  {args.pgrid!r}")
print(f"refit: {args.refit!r}")

$ python3 demo.py --help
usage: demo.py [-h] nfcv pgrid [refit]

Classify, build and transform a dataset

positional arguments:
  nfcv        The NFCV argument...
  pgrid       Comma-separated pgrid values
  refit       The refit argument...

optional arguments:
  -h, --help  show this help message and exit
$ python3 demo.py foo 42,81,117
NFCV:  'foo'
prid:  [42, 81, 117]
refit: ''
$ python3 demo.py foo 42,81,117 y
NFCV:  'foo'
prid:  [42, 81, 117]
refit: 'y'

请注意,如果将refit用作 switch ,则只需使用store_true操作并将其设为-r/--refit命令行参数:

parser.add_argument(
    '-r', '--refit', action='store_true', default=False,
    help="Enable refit"
)

代替parser.add_argument('refit', ...)行。在那种情况下,args.refit是一个布尔值,默认为False,并且是-r或在命令行上使用的--refit设置为True。然后只需使用if args.refit:进行测试即可。

具有此更改的演示如下:

$ python3 demo.py --help
usage: demo.py [-h] [-r] nfcv pgrid

Classify, build and transform a dataset

positional arguments:
  nfcv         The NFCV argument...
  pgrid        Comma-separated pgrid values

optional arguments:
  -h, --help   show this help message and exit
  -r, --refit  Enable refit
$ python3 demo.py foo 42,81,117
NFCV:  'foo'
prid:  [42, 81, 117]
refit: False
$ python3 demo.py foo 42,81,117 --refit
NFCV:  'foo'
prid:  [42, 81, 117]
refit: True

答案 1 :(得分:0)

  • argv[0]始终是程序的名称;
  • argv[1]是第一个参数;
  • argv[2]是第二个参数; 等

因此,如果要确认有多少个参数,则需要记住,“第一个”参数实际上是程序的名称!

您要len(sys.argv)>3,而不是2