Python中是如何接收在终端中输入(自定义的)命令行参数的?

如何在命令行中指定参数?

如果只是要用,看这一段就足够了,下面原理的讲解可以不用看。

假设有一个在src子文件夹中的baseline_main.py文件

    args = args_parser()
    if args.gpu:
        torch.cuda.set_device(args.gpu)
    device = 'cuda' if args.gpu else 'cpu'

想要用0号GPU运行的指令为

python src/baseline_main.py --gpu=0

如果没有指定,默认运行在CPU上

python src/baseline_main.py

补充:CUDA是计算统一设备架构(Compute Unified Device Architecture)的缩写,它是由NVIDIA公司开发的一种并行计算平台和编程模型。通过使用CUDA,开发人员可以利用NVIDIA的图形处理器(GPU)来执行通用计算任务,这样可以大大加速许多计算密集型任务。

 细究arg_parser()

option.py完整代码

其实由三部分组成

  • parser = argparse.ArgumentParser()
  • parser.add_argument()
  • args = parser.parse_args()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Python version: 3.6

import argparse


def args_parser():
    parser = argparse.ArgumentParser()

    # federated arguments (Notation for the arguments followed from paper)
    parser.add_argument('--epochs', type=int, default=10,
                        help="number of rounds of training")
    parser.add_argument('--num_users', type=int, default=100,
                        help="number of users: K")
    parser.add_argument('--frac', type=float, default=0.1,
                        help='the fraction of clients: C')
    parser.add_argument('--local_ep', type=int, default=10,
                        help="the number of local epochs: E")
    parser.add_argument('--local_bs', type=int, default=10,
                        help="local batch size: B")
    parser.add_argument('--lr', type=float, default=0.01,
                        help='learning rate')
    parser.add_argument('--momentum', type=float, default=0.5,
                        help='SGD momentum (default: 0.5)')

    # model arguments
    parser.add_argument('--model', type=str, default='mlp', help='model name')
    parser.add_argument('--kernel_num', type=int, default=9,
                        help='number of each kind of kernel')
    parser.add_argument('--kernel_sizes', type=str, default='3,4,5',
                        help='comma-separated kernel size to \
                        use for convolution')
    parser.add_argument('--num_channels', type=int, default=1, help="number \
                        of channels of imgs")
    parser.add_argument('--norm', type=str, default='batch_norm',
                        help="batch_norm, layer_norm, or None")
    parser.add_argument('--num_filters', type=int, default=32,
                        help="number of filters for conv nets -- 32 for \
                        mini-imagenet, 64 for omiglot.")
    parser.add_argument('--max_pool', type=str, default='True',
                        help="Whether use max pooling rather than \
                        strided convolutions")

    # other arguments
    parser.add_argument('--dataset', type=str, default='mnist', help="name \
                        of dataset")
    parser.add_argument('--num_classes', type=int, default=10, help="number \
                        of classes")
    parser.add_argument('--gpu', default=None, help="To use cuda, set \
                        to a specific GPU ID. Default set to use CPU.")
    parser.add_argument('--optimizer', type=str, default='sgd', help="type \
                        of optimizer")
    parser.add_argument('--iid', type=int, default=1,
                        help='Default set to IID. Set to 0 for non-IID.')
    parser.add_argument('--unequal', type=int, default=0,
                        help='whether to use unequal data splits for  \
                        non-i.i.d setting (use 0 for equal splits)')
    parser.add_argument('--stopping_rounds', type=int, default=10,
                        help='rounds of early stopping')
    parser.add_argument('--verbose', type=int, default=1, help='verbose')
    parser.add_argument('--seed', type=int, default=1, help='random seed')
    args = parser.parse_args()
    return args

最后返回一个args对象,args.gpu就是该对象的其中一个属性。

parser = argparse.ArgumentParser()

argparse.ArgumentParser() 是 Python 标准库中的一个类,用于创建命令行界面(command-line interfaces)的解析器。它允许您定义程序所需的命令行参数,并能够从命令行中解析这些参数。这使得您可以通过命令行界面来配置程序的行为,而不必在每次运行程序时都手动更改源代码。

parser.add_argument()

不难发现,都用了同一个函数

def add_argument(self, *args, **kwargs):
  • *args:位置参数,可以是零个或多个。用于定义参数名称(例如 '--epochs')。
  • **kwargs:关键字参数,用于定义其他参数属性(例如 type, default, help 等)。

从help关键字中还可以发现一个可以快速搞清楚参数的指令,这样就能减少看不懂参数指的是什么的麻烦。

在终端输入

(testfile) PS \联邦学习框架Federated-Learning-PyTorch> python src/federated_main.py --help

输出

usage: federated_main.py [-h] [--epochs EPOCHS] [--num_users NUM_USERS] [--frac FRAC] [--local_ep LOCAL_EP] [--local_bs LOCAL_BS] [--lr LR] [--momentum MOMENTUM] [--model MODEL] [--kernel_num KERNEL_NUM]
                         [--kernel_sizes KERNEL_SIZES] [--num_channels NUM_CHANNELS] [--norm NORM] [--num_filters NUM_FILTERS] [--max_pool MAX_POOL] [--dataset DATASET] [--num_classes NUM_CLASSES] [--gpu GPU]
                         [--optimizer OPTIMIZER] [--iid IID] [--unequal UNEQUAL] [--stopping_rounds STOPPING_ROUNDS] [--verbose VERBOSE] [--seed SEED]

options:
  -h, --help            show this help message and exit
  --epochs EPOCHS       number of rounds of training
  --num_users NUM_USERS
                        number of users: K
  --frac FRAC           the fraction of clients: C
  --max_pool MAX_POOL   Whether use max pooling rather than strided convolutions
  --dataset DATASET     name of dataset
  --num_classes NUM_CLASSES
                        number of classes
  --gpu GPU             To use cuda, set to a specific GPU ID. Default set to use CPU.
  --optimizer OPTIMIZER
                        type of optimizer
  --iid IID             Default set to IID. Set to 0 for non-IID.
  --unequal UNEQUAL     whether to use unequal data splits for non-i.i.d setting (use 0 for equal splits)
  --stopping_rounds STOPPING_ROUNDS
                        rounds of early stopping
  --verbose VERBOSE     verbose
  --seed SEED           random seed

args = parser.parse_args()

当你使用 args = parser.parse_args() 时,这行代码的作用是将程序运行时传递的命令行参数解析并存储到一个命名空间(args 对象)中,以便你可以在代码中访问这些参数的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值