objgraph无法生成分析图的原因

2014年1月14日 13:23

objgraph 是用于诊断内存问题的有用的工具 

安装objgraph

 

sudo pip install objgraph

用小段测试代码,生成png格式的分析图片

#encoding=utf-8
import objgraph


def main(hi):
    print hi

if __name__ == '__main__':
    hi = 'hi'
    main(hi)
    objgraph.show_backrefs([hi], filename='/tmp/hi.png')

会出现错误

Graph written to /tmp/objgraph-Nieb4E.dot (6 nodes)
Graph viewer (xdot) and image renderer (dot) not found, not doing anyt
hing else   

原因: 缺少依赖包

sudo yum install python-xdot  perl-Image-Dot

 

 

 

 

评论(3) 阅读(3495)

计算上月并且返回格式为xx

2014年1月07日 16:31

要求计算上月,并且返回格式为XX的

now = datetime.datetime.now()
last = now - datetime.timedelta(days=now.day)
print last.strftime('%m')

计算下个月

import calendar
import datetime

now = datetime.datetime.now()
max_days = calendar.monthrange(now.year, now.month)[1]
next = now + datetime.timedelta(days=max_days - now.day + 1)
print next.strftime('%m')

评论(0) 阅读(730)

libpq-fe.h:没有那个文件或目录

2014年1月03日 09:13

安装psycopg2出现这个错误,需要安装postgresql-devel

sudo yum install postgresql-devel

评论(0) 阅读(930)

Python.h:没有那个文件或目录

2014年1月03日 09:09

安装包出现上面错误,是因为缺少python-devel

sudo yum install python-devel

评论(0) 阅读(709)

SimpleHttpServer出现unicodeDecodeError

2013年12月30日 09:46

在win8系统下运行 python -m SimpleHTTPServer 出现Traceback (most recent call last):

  File "D:\Python27\lib\runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "D:\Python27\lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "D:\Python27\lib\SimpleHTTPServer.py", line 27, in <module>
    class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  File "D:\Python27\lib\SimpleHTTPServer.py", line 208, in SimpleHTTPRequestHand
ler
    mimetypes.init() # try to read system mime.types
  File "D:\Python27\lib\mimetypes.py", line 358, in init
    db.read_windows_registry()
  File "D:\Python27\lib\mimetypes.py", line 258, in read_windows_registry
    for subkeyname in enum_types(hkcr):
  File "D:\Python27\lib\mimetypes.py", line 249, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal
not in range(128)

在import SimpleHTTPServer时,同样出现上面的错误.

在import sys后面加上下面语句

reload(sys)
sys.setdefaultencoding('gbk')

评论(0) 阅读(1416)

with让数据库操作代码变得清爽

2013年12月17日 21:03

对数据操通常都需要打开与关闭连接,而且用try-finally保证连接被关闭.

这些常规的操作会让代码变得难看.

db = web.database(dbn='oracle', db='......', user='hy', pw='1234')
try:
    db.query("select * from t_c_ms_interface")
finally:
    db.ctx.db.close()

用上下文协议隐藏这些操作

class IPCCCDB:
    def __init__(self):
        self.dns = '....'

    def __enter__(self):
        import web
        self.db = web.database(dbn='oracle', db=self.dns, user='hy', pw='1234')
        return self.db

    def __exit__(self, type, value, traceback):
        self.db.ctx.db.close()

然后,变得如此清爽

with IPCCCDB() as db:
    db.query("select * from t_c_ms_interface")

评论(0) 阅读(969)

python排列*号

2013年12月10日 11:24

输出以下内容

*
***
*****
*******
*********
***********
     *
    ***
   *****
  *******
 *********
***********   
 
借用str的format可以方便的实现,但只有python2.6以上才支持
f = '{:<11}'
print '\n'.join([f.format('*' * i) for i in range(1, 12, 2)])
f = '{:^11}'
print '\n'.join([f.format('*' * i) for i in range(1, 12, 2)])
 

Tags: 字符串
评论(0) 阅读(916)

用python检测文件是否正在被修改

2013年11月17日 23:07

使用lsof filename 可以查询到文件正在被谁使用。下面是python实现的检测代码。

a.py检测代码

#encoding=utf-8
import os


def isOpen(filename):
    # 执行lsof命令
    p = os.popen("lsof %s" % filename)
    # lsof找到打开的文件时有输出
    content = p.read()
    p.close()
    # 通过是否有输出,判断文件是否打开
    return bool(len(content))

if __name__ == '__main__':
    print isOpen("a.log")

b.py模拟正在修改文件

#encoding=utf-8
import time

if __name__ == '__main__':
    f = open("a.log", 'a')
    while True:
        time.sleep(5)

注意只能检测到文件被谁打开的情况。在python中就是open()了一个文件,并且还没有close()掉的情况。

以下情况是检测不到的:

vim xxx

python xxx

上面是比较简陋的一种方式,更强大的功能请见pyinotify模块

评论(1) 阅读(2441)

将[{},{}]转为dict

2013年11月14日 21:31

经常遇到一种需求,需要把从数据库取出的数据,转为dict对象([{}, {},...]-->dict)。

rs = [{"user_id":111, "name":"abc"}, {"user_id":123, "name":"edf"}]
print dict(map(lambda r:[r["user_id"], r], rs))
>>{111: {'user_id': 111, 'name': 'abc'}, 123: {'user_id': 123, 'name': 'edf'}}

上面看起来比较啰嗦,换一种写法

print dict([r["user_id"], r] for r in rs)

更简洁的写法

{r['user_id'] : r for r in rs}

 

 

评论(2) 阅读(1229)