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

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

long@zhouyl:/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

long@zhouyl:/tmp$ python arg.py -a 1 -b=2

Argument a values: 1

Argument b values: 2

long@zhouyl:/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

"""

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

"""

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()

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

long@zhouyl:/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' 参数,如果有则做相应处理。

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

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

python半径为2.11的圆球的体积_python 学习笔记 11 -- 使用参数使你的程序变得更性感...相关推荐

  1. python半径为2.11的圆球的体积_Python科学计算神器之Numpy-2

    这是Numpy学习系列第二部分,第一部分见Numpy-1 4. Array对象的存取 4.1 Array的Indexing,Slicing,Iterating 该部分集中在Numpy的array数据的 ...

  2. python语言的33个保留字的基本含义_Python学习笔记——Python的33个保留字及其意义,python,pythone33,含义...

    Python学习笔记--Python的33个保留字及其意义,python,pythone33,含义 发表时间:2020-03-27 笔记走起 正文 序号 保留字 含义 1 and 用于表达式运算,逻辑 ...

  3. python半径为2.11的圆球的体积_python数据分析第二版(11),利用,Python,进行,复现,十一...

    第12章 pandas高级应用 12.1 分类数据 有一些数据会包含重复的不同值的小集合的情况.可以用unique和value_counts进行分类提取. import numpy as np imp ...

  4. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  5. python条件表达式连起来写一段话_python学习笔记十三条件表达式应用

    彩票游戏: 当号码相等的时候越多,奖金就越多. 而彩票的中奖号码是随机的. 模拟彩票的工作原理,随机产生2个数,然后用户输入两个数字,通过数字的匹配来判断用户是否中奖. 设定以下规则: 当两个数完全相 ...

  6. 编写python程序半径为2.11的圆球的体积_医学生理学(山东大学)知到智慧树题目答案...

    我们常吃的花生米是种子 [单选题]动机说出自(),他认为回忆痛苦的经验将使人回到不愉快的过去,为避免痛苦感受在记忆中的重现,人们常常对这些感受和经验加以抑制,使之不出现在意识中,由此引起遗忘. A. ...

  7. Python学习笔记11:函数修饰符

    Python学习笔记11:函数修饰符 Python有很多有趣的特性,其中函数修饰符就是一个. 我们在之前的那个web应用示例中用过如下写法: @web.route('/log') @符号后边的,就是一 ...

  8. python图形设置_python学习笔记——基本图形绘制

    1.python蟒蛇python蟒蛇代码 #PythonDraw.py import turtle turtle.setup(650,350,200,200)# 设置画布的长.宽.起点 turtle. ...

  9. 点云学习笔记11——VoxelNet算法+代码运行

    点云学习笔记11--VoxelNet算法+代码运行 一.算法分析 摘要 介绍 相关工作 1.2. 贡献 2.VoxelNet 2.1.特征学习网络 2.1.1 特征学习网络 二.代码复现 2.1.环境 ...

最新文章

  1. mysql建立联合索引,mysql建立唯一键,mysql如何解决重复记录联合索引
  2. linux服务器lvs,Linux的企业-LVS(Linux虚拟服务器)及FULLNAT设置
  3. bartlett方差齐性检验_R语言实用教程-数据正态性以及方差齐性检验
  4. Codechef TRIPS Children Trips (分块、倍增)
  5. 12行代码AC——UVa 151 - Power Crisis(约瑟夫环)
  6. 固态硬盘 linux 文件系统,SSD是否需要使用特别的文件系统?
  7. 环境变量_Jenkins流水线环境变量权威指南
  8. 初学c#读书笔记(一)--c#和.NET Framework
  9. LeetCode —— 365. 水壶问题(Python3)
  10. python交互界面实例_Python面向对象编程扑克牌发牌程序,另含大量Python代码!
  11. 秒懂文件路径 ‘/‘ , ‘./‘ , ‘../‘ 的区别
  12. PTA平台之温度转换
  13. matlab erf erfi,误差函数
  14. 三星BESPOKE家电系列海外发布会看点一览,定制化设计成未来家居首选
  15. 使用vuex实现一个简单的小应用
  16. 取消UL和OL符号以及padding和margin后恢复默认值的CSS
  17. PyQt4设计UI界面并添加简单功能【python+pyqt4+opencv】
  18. cocos2dx-精灵的移动跳跃
  19. halcon中怎么降低图像亮度_图像亮度调整
  20. 项目新增commitLint 和 husky 步骤

热门文章

  1. spring interceptor 拦截方法,判断用户是否存在
  2. WIFI加密技术介绍
  3. 常用的C#方法【Format.CS】
  4. netcore 实现一个简单的Grpc 服务端和客户端
  5. 错误/异常:java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind;的解决方法...
  6. 深入理解Plasma(一)Plasma 框架
  7. 洛谷 3833 SHOI 2012 魔法树
  8. Ubuntu Server 安装桌面untiy
  9. .net IO异步和Producer/Consumer队列实现一分钟n次http请求
  10. ES6: 参数默认值及中间域