这个模块经常用, 由于用法比较复杂, 老是用一次忘一次. 今天写一篇学习笔记, 加深印象. refer to: python tutorial

各个level的说明(按等级高低排序):
levels 说明
DEBUG 用来诊断是否有bug的详细信息
INFO 确认程序按预想的执行
WARNING 提示有不期望的事情发生, 或者可能会引起某些未来的问题
ERROR 提示某些更严重的信息, 已经引起某些功能的丧失
CRITICAL 提示某些更严重的错误, 这些错误会导致程序不能往下执行
阅读全文 »

subprocess也是一个常用的模块,目前工作所涉及的都比较浅,所以这里只列出一些基本用法和注意点(只适用*nix系统)。以后用到advanced的内容,会更新此文章。refer to: python DOC

定义:

spawn新的进程,连接input/output/error管道,并获取错误码。
以下模块不建议继续使用,而用subprocess取代:

1
2
3
4
5
os.system
os.spawn*
os.popen*
popen2.*
commands.*

subprocess确实是更加强大,而且以前的模块有时候会有bug。

阅读全文 »

觉得很有用, 摘抄自: http://enml.github.io/site/2014/04/25/python-code/

列表相邻元素压缩器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> a = [1, 2, 3, 4, 5, 6]
>>> zip(*([iter(a)] * 2))
[(1, 2), (3, 4), (5, 6)]
>>> group_adjacent = lambda a, k: zip(*([iter(a)] * k))
>>> group_adjacent(a, 3)
[(1, 2, 3), (4, 5, 6)]
>>> group_adjacent(a, 2)
[(1, 2), (3, 4), (5, 6)]
>>> group_adjacent(a, 1)
[(1,), (2,), (3,), (4,), (5,), (6,)]
>>> zip(a[::2], a[1::2])
[(1, 2), (3, 4), (5, 6)]
>>> zip(a[::3], a[1::3], a[2::3])
[(1, 2, 3), (4, 5, 6)]
>>> group_adjacent = lambda a, k: zip(*(a[i::k] for i in range(k)))
>>> group_adjacent(a, 3)
[(1, 2, 3), (4, 5, 6)]
>>> group_adjacent(a, 2)
[(1, 2), (3, 4), (5, 6)]
>>> group_adjacent(a, 1)
[(1,), (2,), (3,), (4,), (5,), (6,)]
阅读全文 »

昨天在工作中遇到这么一个问题, 在shell中比较浮点数和整数的大小. 原本以为用shell的比较符号(-lt之类的)就可以, 没想到一试不行.
问了度娘后才发现, shell原则上是不支持浮点数计算的.
因为着急用, 就随便找了个帖子说可以这么比:

1
2
>  expr $a \> $b
>

我没test就直接先push到公司的repo了, reviewer估计也没用过, 看了下就merge了.
今天跑脚本才发现根本就不能这么用啊, holy shit. 最后找到了bc这个神器, 问了下度娘, 都没什么好文章. 索性就直接上官网看manual.
好了, 废话说了一大堆, 现在来说说bc吧:)

首先, bc可以是交互性的, 也支持在管道符后面使用.
所以一些复杂的有关浮点数的运算, 完全可以结合expect脚本, 个人感觉会很方便. 如果用awk算, 估计会吐…
像我昨天遇到的普通运算完全就可以用管道啦.
一般来说在脚本中可以这么用:

1
a=$(bc << EOF
  28.3 * 55.8
  EOF)

bc可以说totally就是一门语言. 有变量, 有逻辑控制, 亦有函数.

阅读全文 »