在脚本中使用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
答案 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.nfcv
,args.pgrid
和args.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