参数解析器对象不包含解析器中定义的属性

Argument parser object does not contain attribute defined in parser

我正在开发一个使用神经网络处理高光谱图像超分辨率的程序,现在程序的 Mains 目录包含多个解析器。解析器和子解析器似乎已正确定义

def main():
# parsers
main_parser = argparse.ArgumentParser(description="parser for SR network")
subparsers = main_parser.add_subparsers(title="subcommands", dest="subcommand")
train_parser = subparsers.add_parser("train", help="parser for training arguments")
train_parser.add_argument("--cuda", type=int, required=False,default=1,
                          help="set it to 1 for running on GPU, 0 for CPU")
train_parser.add_argument("--batch_size", type=int, default=32, help="batch size, default set to 64")
train_parser.add_argument("--epochs", type=int, default=40, help="epochs, default set to 20")
train_parser.add_argument("--n_feats", type=int, default=256, help="n_feats, default set to 256")
train_parser.add_argument("--n_blocks", type=int, default=3, help="n_blocks, default set to 6")
train_parser.add_argument("--n_subs", type=int, default=8, help="n_subs, default set to 8")
train_parser.add_argument("--n_ovls", type=int, default=2, help="n_ovls, default set to 1")
train_parser.add_argument("--n_scale", type=int, default=4, help="n_scale, default set to 2")
train_parser.add_argument("--use_share", type=bool, default=True, help="f_share, default set to 1")
train_parser.add_argument("--dataset_name", type=str, default="Chikusei", help="dataset_name, default set to dataset_name")
train_parser.add_argument("--model_title", type=str, default="SSPSR", help="model_title, default set to model_title")
train_parser.add_argument("--seed", type=int, default=3000, help="start seed for model")
train_parser.add_argument("--learning_rate", type=float, default=1e-4,
                          help="learning rate, default set to 1e-4")
train_parser.add_argument("--weight_decay", type=float, default=0, help="weight decay, default set to 0")
train_parser.add_argument("--save_dir", type=str, default="./trained_model/",
                          help="directory for saving trained models, default is trained_model folder")
train_parser.add_argument("--gpus", type=str, default="1", help="gpu ids (default: 7)")

test_parser = subparsers.add_parser("test", help="parser for testing arguments")
test_parser.add_argument("--cuda", type=int, required=False,default=1,
                         help="set it to 1 for running on GPU, 0 for CPU")
test_parser.add_argument("--gpus", type=str, default="0,1", help="gpu ids (default: 7)")


args = main_parser.parse_args()

os.environ['CUDA_VISIBLE_DEVICES'] = args.gpus
print(args.gpus)
if args.subcommand is None:
    print("ERROR: specify either train or test")
    sys.exit(1)
if args.cuda and not torch.cuda.is_available():
    print("ERROR: cuda is not available, try running on CPU")
    sys.exit(1)
if args.subcommand == "train":
    train(args)
else:
    test(args)
pass

但是,在使用 args 对象时,编译器会抛出一个错误,指出该对象没有属性 gpus。虽然,测试解析器确实包含属性 'gpus'

"G:\Python projects\venv\Scripts\python.exe" "G:/Hyperspectral ISRO/SSPSR-master/mains.py"
Traceback (most recent call last):
  File "G:\Hyperspectral ISRO\SSPSR-master\mains.py", line 309, in <module>
    main()
  File "G:\Hyperspectral ISRO\SSPSR-master\mains.py", line 70, in main
    os.environ['CUDA_VISIBLE_DEVICES'] = args.gpus
AttributeError: 'Namespace' object has no attribute 'gpus'

我无法弄清楚为什么会这样,因为我相信我在使用 args 之前正确地解析了参数,我试图在论坛上找到类似的问题,但没有找到。

您只需:

args = main_parser.parse_args()
print(args) # for debugging help

if args.subcommand is None:
    print("ERROR: specify either train or test")
    sys.exit(1)

# now it's safe to reference `gpus` and `cuda` which are defined by both subparsers

os.environ['CUDA_VISIBLE_DEVICES'] = args.gpus

if args.cuda and not torch.cuda.is_available():
    print("ERROR: cuda is not available, try running on CPU")
    sys.exit(1)
if args.subcommand == "train":
    train(args)
else:
    test(args)

请注意 traintest 会有所不同 argstrain 不会获得任何 test 值。

尝试不同的命令行值并注意 args.

中的差异

如果你使用

subparsers = main_parser.add_subparsers(title="subcommands", dest="subcommand",
     required=True)

您不需要为 args.subcommand is None 做自己的测试。解析器会为您完成。