通用技术 python 学习之路

周冬彬 · 2016年10月12日 · 最后由 周冬彬 回复于 2016年10月17日 · 2478 次阅读

目的

  • 记录一下学习 python 过程的一些内容

内容

获取命令行参数的模块 getopt

  • sys.argv[]

sys.argv 是命令行参数列表,注:sys.argv[0] 表示脚本名。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
print '参数个数为:', len(sys.argv), '个参数。'
print '参数列表:', str(sys.argv)

执行以上代码,输出结果为:

$ python test.py arg1 arg2 arg3
参数个数为: 4 个参数。
参数列表: ['test.py', 'arg1', 'arg2', 'arg3']
  • getopt

getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是 sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(--)。
该模块提供了两个方法及一个异常处理来解析命令行参数。
getopt.getopt 方法
getopt.getopt 方法用于解析命令行参数列表,语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明:
args: 要解析的命令行参数列表。
(可以取 sys.argv[1:],[1:] 表示忽略脚本名)
options: 以字符串的格式定义,options 后的冒号 (:) 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数,即开关选项。
(比如-h 是开关选项不需要后面加参数值,所以直接以 “h” 表示;-o output 不是开关选项,后面必须加参数 output,所以可以以"o:",两者一起表示可以用"ho:")
long_options: 以列表的格式定义,long_options 后的等号 (=) 表示如果设置该选项,必须有附加的参数,否则就不附加参数。
该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有'-'或'--'的参数。
(和 options 类似,只不过表达形式不一样,这个是以 list 格式表示,且非开关选项用"="表示,例如 ["help","output="])
另外一个方法是 getopt.gnu_getopt,这里不多做介绍。

  • Exception getopt.GetoptError

在没有找到参数列表,或选项的需要的参数为空时会触发该异常。
异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。

执行系统命令

主流的有 4 种os.system()os.popen()commands.getstatusoutput()subprocess.Popen()

  • os.system() 这种是最简单的,但是只能执行,不能获取返回值

  • os.popen() 这种能拿到返回值,但是不能拿到返回状态

  • commands.getstatusoutput() 这种在 Windows 上会出现兼容性问题,无法执行(亲测),但是在 Linux 平台上还是挺好用的

  • subprocess.Popen() 目前我采用的是这种方式,给一个这种方式的 demo

import subprocess  # 导入subprocess模块
cmd = 'ls -al'  # 定义需要执行的cmd
child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # 执行系统命令
# child.wait() # 等待系统命令返回后再执行后续命令,看需要可加可不加
(stdoutdata, stderrdata) = child.communicate() # 获取返回数据
print child.returncode # 打印查看命令的returncode
print("stderrdata:%s") % stderrdata # 打印查看

log 记录

这边我用的是 logging 模块,直接上代码

# util.py
#! /usr/bin/env python
# -*- coding:utf-8 -*-

import logging # 导入logging模块

# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('./test.log')

# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()

# 定义handler的输出格式formatter
formatter = logging.Formatter('[%(asctime)s][%(filename)s][%(levelname)s]:%(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger.addHandler(ch)

# test.py
import util

util.logger.debug("i am debug")

# console输出
[2016-10-17 11:19:36,999][monkey.py][DEBUG]:i am debug

先记录到这里,之后补充

共收到 8 条回复 时间 点赞

我一般用 argparse ,写起来代码可读性比较高,也好维护。

都学习了,我也开始看 python,目前是 helloworld 水平,不知道 python 是不是和 java 类似也能做面向对象编程

#2 楼 @softblank 是的,同开始学习中

@chenhengjie123 希望有一些带有设计模式和 python 相结合的资料能够学习,这样不会有语法学完后只能写脚本的尴尬...

这个命令行参数在其他工具支持命令行,而你又要通过这个命令行调用某个 python 脚本的时候特别有用,因为这样就可以通过他将这个工具的某些参数传递给 python 脚本了
如果在 SVN 中调用 hook,SVN 提供的一些参数就能通过这样的方法传进去

#1 楼 @chenhengjie123 恩恩,有时间看看,先掌握一个,再做对比

#2 楼 @softblank 必须可以面向对象呀,面向过程有时候脚本出异常不太靠谱,python 还是很强大的

#5 楼 @LindaZhangTestEngineer 恩,之前都是全部在配置文件中写死的,正好抽空系统的学习一下就把这个剥离出来了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册