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条内容
所有评论(0)