python 学习笔记 11 -- 使用参数使你的程序变得更性感

当然,在之前的系列中,我已介绍如何给 Python 脚本传参,当然,今天不会继续介绍这么无聊的东东。首先使用 python 的sys.argv 传参的话,就固定了参数的个数、顺序以及格式,这么死的规定如何性感?

I have a dream , to make my code much sexer ! 今天我们简单介绍一下如何更加随性的给 python 脚本传参。效果如下:

[email protected]:/tmp$ python arg.py -h
NAME:
    project with user set arguments

SYNOPSIS:
    [python] arg.py [OPTION]...

DESCRIPTION:
    -h, --Help           Print this help (work alone, won't work while be mixed with other argu)
    -a, --testa          a value
    -b, --testb          b value
AUTHOR:
    Zhou Yunlong <[email protected]>

[email protected]:/tmp$ python arg.py -a 1 -b=2
Argument a values: 1
Argument b values: 2
[email protected]:/tmp$ python arg.py -a 1 -b='/home/long'
Argument a values: 1
Argument b values: /home/long

我们可以看到,有了很Linux 的help 帮助信息 ,还可以随便传递参数。是不是很好玩,下面简单介绍:

一、 如何获取不定个数的参数

当然,万变不离其宗,偶们还是得老老实实的靠 sys.argv 来传递参数,但是我们之前介绍的博文中是这样传递参数的:

(script, first_argu, second_argu)= sys.argv

这样固然简单易用,但是问题就是参数的数量、顺序、格式都根据脚本中接收代码确定下来,没有易用性。

那么我们如何解决带不定数量的参数呢? 我使用的方法很简单, 不使用固定数量的变量来接收参数,来一个哥接一个,全给你放到列表中:

def add_sys_argv():
    arg_list = []
    for i in range(1, len(sys.argv)):
        arg_list.append(sys.argv[i])
    return arg_list

那么,这个函数获取并返回的列表中存放的都是用户传递进来的参数呢。所以,一切就变得更加简单了。

二、 查找参数

很多的Linux 命令中都可以不固定参数的顺序,且一般都是遵循 “ -[OPTION] VALUE ” 的顺序,这样传进来的参数,哇哦,好判断,我只要使用 " if ‘-a‘ in argu_list " 即可。

但是我想要它更性感,不知你有没有使用过 “ -[OPTION]=VALUE ”
这样的赋值, 我感觉这样的赋值也挺好,不会弄乱,看起来也很方便。而对于参数列表中接收到的 "-a=123"参数项,只使用 " if ‘-a‘ in argu_list " 就不能找到咯,我们需要使用 字符串的 find  方法。

查找函数很简单:

def check_arument_in(argu, arg_list):
    for i in range(0, len(arg_list)):
        if arg_list[i].find(argu) != -1 :
            return True
    return False

对于列表中的每一项进行find ,如果找到返回 True ,如果整个列表都找不到则返回 False。

对于参数的值的获取,因为我想要 “ -[OPTION] VALUE ” 和 “ -[OPTION]=VALUE ” 
在这两种赋值方法都可以使用,所以使用check_arument_in 查找到后还需要对此项进行查找有没有 ‘=‘ ,如果有就在此项中得到赋值,如果没有‘=‘ 赋值就是列表的下一个值:

def get_argument_value(argu, arg_list):
    for i in range(0, len(arg_list)):
        if arg_list[i].find(argu) != -1 :
            if arg_list[i].find('=') != -1 :
                a_argu = arg_list[i].split("=")[1]
                if len(a_argu) == 0:
                    return 0
                else:
                    return a_argu
            elif (i+1) <= len(arg_list):
                a_argu = arg_list[i+1]
                return a_argu
            else:
                print "it seems that argument is error"
                return 0

三、 对参数做出相应处理

进入脚本之后我们首先使用一个函数对参数进行判断:

def get_user_argu():
    sys_arg_list = add_sys_argv()
    if '-h' in sys_arg_list and len(sys_arg_list) == 1:    # 如果参数只有一个,且是"-h" 的话,调用打印help 信息的函数
        print_usage()
    if check_arument_in('-a', sys_arg_list):                  # 此后就需要对你关心的参数项进行查找并获取,如果有则做相应的操作。
        a_argu = get_argument_value('-a', sys_arg_list)
        print "Argument a values: %s" % a_argu
    if check_arument_in('-b', sys_arg_list):
        b_argu = get_argument_value('-b', sys_arg_list)
        print "Argument b values: %s" %  b_argu

对于打印help 信息的函数就更简单了:

def print_usage():
    print """NAME:
    project with user set arguments \n
SYNOPSIS:
    [python] arg.py [OPTION]... \n
DESCRIPTION:
    -h, --Help           Print this help (work alone, won't work while be mixed with other argu)
    -a, --testa          a value
    -b, --testb          b value
AUTHOR:
    Zhou Yunlong <[email protected]>
"""
    sys.exit()

四、 完整程序赏析

整个示例 arg.py 很简单:

#!/usr/bin/python
import sys

def add_sys_argv():
    leng = len(sys.argv)
    arg_list = []
    for i in range(1, leng):
        arg_list.append(sys.argv[i])
    return arg_list

def check_arument_in(argu, arg_list):
    for i in range(0, len(arg_list)):
        if arg_list[i].find(argu) != -1 :
            return True
    return False

#print arg_list
def get_argument_value(argu, arg_list):
    for i in range(0, len(arg_list)):
        if arg_list[i].find(argu) != -1 :
            if arg_list[i].find('=') != -1 :
                a_argu = arg_list[i].split("=")[1]
                if len(a_argu) == 0:
                    return 0
                else:
                    return a_argu
            elif (i+1) <= len(arg_list):
                a_argu = arg_list[i+1]
                return a_argu
            else:
                print "it seems that argument is error"
                return 0

def print_usage():
    print """NAME:
    project with user set arguments \n
SYNOPSIS:
    [python] arg.py [OPTION]... \n
DESCRIPTION:
    -h, --Help           Print this help (work alone, won't work while be mixed with other argu)
    -a, --testa          a value
    -b, --testb          b value
AUTHOR:
    Zhou Yunlong <[email protected]>
"""
    sys.exit()

def get_user_argu():
    sys_arg_list = add_sys_argv()
    print sys_arg_list
    if '-h' in sys_arg_list and len(sys_arg_list) == 1:
        print_usage()
    if check_arument_in('-a', sys_arg_list):
        a_argu = get_argument_value('-a', sys_arg_list)
        print "Argument a values: %s" % a_argu
    if check_arument_in('-b', sys_arg_list):
        b_argu = get_argument_value('-b', sys_arg_list)
        print "Argument b values: %s" %  b_argu

get_user_argu()

运行结果在上面已经展示过了,但是因为示例过于简单,还未对参数的内容进行判断,所以可能会出现这样的错误:

[email protected]:/tmp$ python arg.py -a  -b='/home/long'
Argument a values: -b=/home/long

所以,如果你想要你的程序更加完整以及安全,就需要对参数进行更多的判断以及审核

五、 关于大型程序的参数处理

对于一些大型程序中使用的参数处理并不是上面我这样,而且很好玩,很适宜我们学习。

这里我们以GCC的 gcov  为例:

static int
process_args (int argc, char **argv)
{
  int opt;

  while ((opt = getopt_long (argc, argv, "abcfiIhlno:puv", options, NULL)) != -1)
    {
      switch (opt)
    {
    case 'a':
      flag_all_blocks = 1;
      break;
    case 'b':
      flag_branches = 1;
      break;
    ...

我们可以看到,GCOV 中对于接收到的参数进行switch 判断,得到参数后也只是对一个flag变量进行赋值,而在程序正常处理时,则是这样:

      if (flag_all_blocks)
    {
      block_t *block;
      arc_t *arc;
      int ix, jx;

      for (ix = jx = 0, block = line->u.blocks; block;
           block = block->chain)
...

flag_all_blocks 参数在程序中定义为0,只有用户带了 ‘-a‘ 参数,才会在上面的switch ...case 中将其变为1, 于是在程序运行到与之相关的部分时,只需要对 flag_all_blocks 进行判断就可以知道用户有没有携带‘-a‘ 参数,如果有则做相应处理。

==============

对于本文中的方法实属自己没事瞎玩,如果你有更好地方法,还请在留言中赐教。

转载注明出处: CSDN博客 -- longerzone的专栏

python 学习笔记 11 -- 使用参数使你的程序变得更性感

时间: 2024-10-03 13:38:49

python 学习笔记 11 -- 使用参数使你的程序变得更性感的相关文章

python学习笔记11 ----网络编程

网络编程 网络编程需要知道的概念 1.网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. 网络(OSI)的7层模型: 应用层--->为应用程序提供网络通信服务 表示层--->数据表示 会话层--->主机间通信(两个应用进程间) 传输层--->端到端的连接,隔离网络的上下层协议,使得网络应用与下层协议无关 网络层--->寻找最优路径,转发数据包 数据链路层---&

Python学习笔记11—函数

建立第一个函数 /usr/bin/env Python #coding:utf-8 def add_function(a,b): c = a+b print c if __name__=="__main__": add_function(2,3) 在定义函数的时候,参数可以像前面那样,等待被赋值,也可以定义的时候就赋给一个默认值.例如 >>> def times(x,y=2): #y的默认值为 2 ... print "x=",x ... prin

Python学习笔记11:标准库之文件管理

1 os包 os包包括各种各样的函数,以实现操作系统的许多功能.这个包非常庞杂.os包的一些命令就是用于文件管理. 我们这里列出最常用的: mkdir(path) 创建新目录,path为一个字符串,表示新目录的路径.相当于$mkdir命令 比如说我们要新建目录new: import os os.mkdir('/home/Document/new') rmdir(path) 删除空的目录,path为一个字符串,表示想要删除的目录的路径.相当于$rmdir命令 listdir(path) 返回目录中

Python学习笔记(二)Pytho解释器和程序开发、执行过程

解释器是一种让其他程序运行起来的程序,是用户编写的代码与计算机硬件间的软件从逻辑层,虚拟化技术的一种.Python可以被当做一种解释器软件包,Python代码必须在解释器中运行,因此机器上安装Python的最小组件是-解释器和支持的库.本文只针对Windows平台,将Python加入到环境变量path中,如"C:\Python34",Python版本为3.4,下同. 1,程序编写 Python程序编写支持交互式和执行文件两种,前者就是在命令行键入指令.回车立刻得到执行效果,后者则是先写

python 学习笔记 12 -- 写一个脚本获取城市天气信息

最近在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么能够显示后最重要的就是显示什么的问题了.最容易想到的就是显示时间啊,CPU利用率啊,IP地址之类的.那么我觉得呢,如果能够显示当前时间.温度也是甚好的,作为一个桌面小时钟还是很精致的. 1. 目前有哪些工具 目前比较好用的应该是 weather-util, 之前我获取天气信息一般都是通过它. 使用起来也很简单: (1) Debian/Ubuntu 用户使用 sudo apt-get install weather-util 安装

python基础教程_学习笔记11:魔法方法、属性和迭代器

魔法方法.属性和迭代器 在python中,有的名称会在前面和后面各加上两个下划线,这种写法很特别.它表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字.在python中,由这些名字组成的集合所包含的方法叫做魔法(或称特殊)方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被python调用,而几乎没有直接调用它们的必要. 准备工作 为了确保类是新型的,应该把赋值语句__metaclass__=type放在你的模块的最开始,或者(直接或间接)子类化内建类(实际上是类型)ob

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定 springmvc学习笔记11-springmvc注解开发之简单参数绑定 spring参数绑定过程 默认支持的类型 简单类型 pojo绑定 自定义参数绑定实现日期类型绑定 springmvc和struts2的区别 本文主要介绍注解开发的简单参数绑定,包括简单类型.简单pojo以及自定义绑定实现类型转换 spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到contro

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

python学习笔记[3]-邮件的发送

本文摘抄自:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1.smtplib模块 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])   SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行