Python 命令行参数详解

Python 命令行参数详解

*
0. 命令行参数
1. sys.argv
2. getopt

+ 2.1 getopt.getopt 方法
+ 2.2 Exception getopt.GetoptError
3. argparse

0. 命令行参数

通常,对于大型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这些命令行参数是提供给包含某种参数化信息的程序或脚本的参数。例如,在计算机视觉项目中,图像和不同类型的文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件。
命令行参数是参数化程序执行的一种常见且简单的方法,下面主要介绍三种常见的获取和解析命令行参数的方法。

1. sys.argv

为了处理命令行参数,Python 中内置了 sys.argv 模块,通过模块中的 sys.argv 就可以访问到所有的命令行参数,它的返回值是包含所有命令行参数的列表 (list)。当程序执行时,Python 从命令行获取所有值并将它们存储在 sys.argv 列表中。列表的第一个元素 sys.argv[0] 是脚本的完整路径(或脚本名称——取决于具体操作系统)。列表的第二个元素是脚本的第一个命令行参数,即 sys.argv[1],依此类推。这可以通过下图中清晰的看出,其中 script_1.py 脚本使用两个参数执行:

Python 命令行参数详解
接下来,让我们看看 sys.argv 是如何工作的,首先编写 scripy_1.py 脚本:
import sys
print("正在运行的脚本名称: '{}'".format(sys.argv[0]))
print("脚本的参数数量: '{}'".format(len(sys.argv)))
print("脚本的参数: '{}'".format(str(sys.argv)))

如果我们不使用任何参数执行这个脚本:

python script_1.py

将会看到如下信息:

正在运行的脚本名称: 'script_1.py'
脚本的参数数量: '1'
脚本的参数: '['script_1.py']'

如果我们使用多个参数执行此脚本:

python script_1.py OpenCV -i test.png

将得到以下信息:

正在运行的脚本名称: 'script_1.py'
脚本的参数数量: '4'
脚本的参数: '['script_1.py', 'OpenCV', '-i', 'test.png']'

如上所示,列表的第一个元素 script_1.py (sys.argv[0]) 是脚本名称。列表的第二个元素 (sys.argv[1]) OpenCV 是脚本的第一个参数。但同时也可以看到,sys.argv 将命令行选项 -i 也识别为参数,这样并不能方便的满足我们的需求,因此引入 getopt 模块来识别命令行选项。

2. getopt

getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数。命令行选项使得程序的参数更加灵活,其支持短选项模式(-)和长选项模式(–)。
该模块提供了两个方法及一个异常处理来解析命令行参数。

2.1 getopt.getopt 方法

getopt.getopt 方法用于解析命令行参数列表,其语法格式如下:

getopt.getopt(args, options[, long_options])

方法参数说明如下表所示:

参数说明args要解析的命令行参数列表,一般是sys.argv[1:],需要过滤掉脚本名(sys.argv[0])options以字符串的格式定义,options 后的冒号 ” :

” 表示如果设置该选项,必须有附加的参数,否则就不附加参数long_options以列表的格式定义,long_options 后的等号 ” =

” 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数

该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有 – 或 – 的参数。
下面编写 script_2.py 脚本进行演示:

import sys
import getopt

def main(argv):
    input_file = ""
    output_file = ""

    opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            print('script_2.py -i  -o ')
            print('or: test_arg.py --input_file= --output_file=')
            sys.exit()
        elif opt in ("-i", "--input_file"):
            input_file = arg
        elif opt in ("-o", "--output_file"):
            output_file = arg
    print('输入文件为:', input_file)
    print('输出文件为:', output_file)

    for i in range(0, len(args)):
        print('不含'-'或'--'的参数 %s 为:%s' % (i + 1, args[i]))

if __name__ == "__main__":
    main(sys.argv)

使用带有命令行选项的命令执行此脚本,以下两种方式是等价的:


python scripy_1.py -i test.png -o output.png OpenCV

python scripy_1.py --input_file test.png --output_file output.png OpenCV

输出得到以下信息:

输入文件为: test.png
输出文件为: output.png
不含'-'或'--'的参数 1 为:OpenCV

2.2 Exception getopt.GetoptError

在参数列表中没有找到所传递参数,或选项的需要的参数为空时会触发该异常。异常的参数是一个字符串,表示错误的原因。属性 msgopt 为相关选项的错误信息。
在上述代码中添加异常处理,检查此错误信息:


def main(argv):
    input_file = ""
    output_file = ""
    try:
        opts, args = getopt.getopt(argv[1:], "hi:o", ["help", "input_file=", "output_file="])
    except getopt.GetoptError as e:
        print(e.msg)
        print(e.opt)
        sys.exit(2)

使用错误的格式选项传递参数执行脚本:

python scripy_1.py -f

输出以下错误信息:

option -f not recognized
f

3. argparse

当程序中使用采用复杂参数或多个文件名时,推荐使用 Python 的 argparse 库,它以系统的方式处理命令行参数,从而可以编写用户友好的命令行程序。Python 标准库 argparse 同样也是用于解析命令行参数的模块。首先,由程序确定所需的参数,然后, argparse 将这些参数解析为 sys.argv。此外, argparse 会生成帮助和使用信息提示,并在提供无效参数时发出错误。
为了介绍此模块,编写 script_3.py,如下所示:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

不带参数运行此脚本不会向 stdout 显示任何内容。但是,如果使用 --help-h 选项,将得到脚本的使用信息提示:

usage: scripy_3.py [-h]
optional arguments:
-h, --help show this help message and exit

指定其他参数会导致错误,例如使用如下命令:

scripy_3.py -i

则会报导致错误:

usage: scripy_3.py [-h]
argparse_minimal.py: error: unrecognized arguments: -i

由于未定义参数,因此不允许其他参数,接下来就添加一个参数,编写 script_4.py 脚本:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("first_argument", help="this is the string text in connection with first_argument")
args = parser.parse_args()
print(args.first_argument)

这里添加了 add_argument() 方法。此方法用于指定程序将接受哪些命令行选项,此处添加了 first_argument 参数。此外, argparse 模块存储所有参数,将其名称与每个添加参数的名称相匹配——在此处为 first_argument 。为了获得参数值,需要使用 args.first_argument
如果此脚本以下示方法执行,则输出为 10:

python scripy_4.py 10

但如果脚本在没有参数的情况下执行,则将输出以下信息:

usage: scripy_4.py [-h] first_argument
scripy_4.py: error: the following arguments are required: first_argument

最后,如果我们使用 -h 选项执行脚本,输出将如下所示:

usage: scripy_4.py [-h] first_argument

positional arguments:
  first_argument  this is the string text in connection with first_argument

optional arguments:
  -h, --help      show this help message and exit

默认情况下,argparse 将提供的选项视为字符串。因此,如果参数不是字符串,则应使用 type 选项。使用 script_5.py 脚本,其中添加了两个参数,这两个参数是 int 类型:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("first_number", help="first number to be added", type=int)
parser.add_argument("second_number", help="second number to be added", type=int)
args = parser.parse_args()
print("args: '{}'".format(args))
print("the sum is: '{}'".format(args.first_number + args.second_number))
args_dict = vars(parser.parse_args())
print("args_dict dictionary: '{}'".format(args_dict))
print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))

在前面的示例中,通过调用 vars() 函数将参数存储在字典中:

args_dict = vars(parser.parse_args())
print("args_dict dictionary: '{}'".format(args_dict))
print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))

如果不带参数执行脚本:

python script_5.py

则输出如下:

usage: scripy_5.py [-h] first_number second_number
scripy_5.py: error: the following arguments are required: first_number, second_number

此外,如果我们使用 -h 选项执行脚本:

python script_5.py --help

输出将如下所示:

usage: scripy_1.py [-h] first_number second_number

positional arguments:
  first_number   first number to be added
  second_number  second number to be added

optional arguments:
  -h, --help     show this help message and exit

如果此脚本以如下方式执行:

python script_5.py 123 456

则输出如下:

args: 'Namespace(first_number=123, second_number=456)'
the sum is: '579'
args_dict dictionary: '{'first_number': 123, 'second_number': 456}'
first argument from the dictionary: '123'

更多 argparse 的高级介绍可以在官方文档中看到,其中包括了大量示例

Original: https://blog.csdn.net/LOVEmy134611/article/details/119656854
Author: 盼小辉丶
Title: Python 命令行参数详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/728830/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Pytorch常见报错、踩坑点总结(持续更新)

    在利用PyTorch进行深度学习的路上踩坑点实在是太多了,因此打算总结一些,以便日后查阅使用。 一、transforms.ToTensor() 在运行下面一段程序的时候,发现报错提…

    Python 2023年8月28日
    0101
  • 【TCP/IP网络编程-尹圣雨-学习笔记】1. 服务器编程、客户端编程

    函数原型 uint32_t htonl (uint32_t __hostlong); uint16_t htons (uint16_t __hostshort); uint32_t…

    Python 2023年11月5日
    032
  • python

    python正则表达式 1.re.match(pattern,string,flags=0) 参数 描述 pattern 匹配正则表达式 string– 要匹配的字符串– flag…

    Python 2023年5月25日
    064
  • 大数据时代,数据仓库究竟是干嘛的?

    前言 无论你是否专门从事大数据开发,作为一个开发人员,应该都听说过数据仓库的概念,那你知道为什么会出现数据仓库?数据仓库究竟是干嘛的吗?有什么价值和意义呢?那么本文就带到入门,揭开…

    Python 2023年9月30日
    035
  • python人工智能教程——Pandas入门

    关于Pandas Pandas是基于Numpy实现的,其名字来源于两个词语——面板数据(panel data)和数据分析(data analysis)。Pandas最初被应用于金融…

    Python 2023年8月8日
    061
  • P3 元宝的笔记

    创建Django项目 1.打开指定文件夹 2.在路径上输入cmd,在当前位置创建Django项目 3.djang-admin startproject 项目名 4.运行项目:进入指…

    Python 2023年8月4日
    062
  • Pytest测试框架(四):pytest 参数化用例

    中介绍了pytest.fixture()可以参数化fixture函数,@pytest.mark.parametrize 可以为测试方法或者测试类定义多组变量。本文将分享使用@pyt…

    Python 2023年9月12日
    065
  • Python读入txt中的数组

    Python读入txt中的数组(下三角矩阵) 最近写遗传算法作业要用老师给的数据进行测试,于是学习了一些方法…… txt数据格式 提供的数据为城市间距离的下…

    Python 2023年8月23日
    082
  • Pro3:js实现放大镜效果

    在我们平时见到很多购物网站都会有放大镜效果的出现,当我们将鼠标放在一个商品图片的上面,就会在旁边出现对应的放大效果。 ; 实现步骤 实现原理是非常简单的,实际上是两张图片,一张原图…

    Python 2023年10月11日
    050
  • 服务器杂记

    python可以定义class,而且不一定要有初始化函数init nn.Module是所有神经网络的基类,任何pytorch模型都应该继承于它 上游/下游任务:上游任务指对数据做预…

    Python 2023年9月6日
    073
  • python自动化办公、Excel数据处理方法总结

    目录 0. 概述 1. 读取(打开)excel 2. 不规则数据结构pd.read读取 3. xw选取数据转成dataframe 4. xw定位行列位置,将处理结果填入表中 5. …

    Python 2023年8月20日
    064
  • block yandex bot

    我们需要屏蔽 yandexbot(block yandex bot) 可以通过 robots.txt 和 IP 的方式屏蔽,下面分别来讲。 yandex bot user agen…

    Python 2023年6月10日
    0138
  • Django及DRF学习—目录

    在前面的文章中,我们已经 了如何使用 创建RESTful API,并使用Vue.js作为前端框架来消费API。在本文中,我们将继续 如何使用Vue.js和Axios来实现前端和后端…

    Python 2023年8月4日
    048
  • python学生管理系统(pyqt5 含界面)

    学生管理系统项目流程 项目模块 账号登陆 人脸识别 增添学生信息 删除学生信息 改动学生信息 查询学生信息 项目主体框架 app.py为主代码,负责用于界面打开展示。 img文件夹…

    Python 2023年11月5日
    044
  • python pygame sdl2教程_Python之pygame学习(2)

    pygame学习 ✕ 上次学会了初始化,这次来说下显示画面 初始化窗口或屏幕以进行显示 ”’ pygame.display.set_mode 一共三个参数,…

    Python 2023年9月22日
    051
  • 单元测试之pytest

    前提:需要安装pytest和pytest-html(生成html测试报告) pip install pytest 和 pip install pytest-h…

    Python 2023年9月15日
    032
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球