2011年3月30日

pdb - gdb like , python online debugger module

ref : http://pythonconquerstheuniverse.wordpress.com/category/the-python-debugger/

用這個 module 後,就可以像 gdb 一樣對 python code 作單步執行。
但是 python 是直譯式語言,所以要修改 code...
大概就是:
  1. import pdb
  2. 在要開始 trace 的地方加入 pdb.set_trace()

這樣 執行到 pdb.set_trace( ) 這一行,就會中斷,出現 (Pdb) 的 promt,要你輸入command。
用 help 可以顯示一些 ..
(Pdb) help

Documented commands (type help <topic>):
========================================
EOF bt cont enable jump pp run unt
a c continue exit l q s until
alias cl d h list quit step up
args clear debug help n r tbreak w
b commands disable ignore next restart u whatis
break condition down j p return unalias where

Miscellaneous help topics:
==========================
exec pdb

Undocumented commands:
======================
retval rv

os.walk

要處理目錄結構用的
import os

for rootpath, dirlist, filelist in os.walk("./"):
print rootpath, dirlist, filelist

就可以看出效果,以這樣的目錄結構:
.
|-- 2
| |-- 3
| | |-- 4a
| | `-- 4b
| `-- 3a
|-- 2a
`-- 2b
`-- X


剛剛的code會print:
./ ['2b', '2'] ['2a']
./2b [] ['X']
./2 ['3'] ['3a']
./2/3 [] ['4b', '4a']

印出 4 行,也就是說,上面的 code, ,loop 4 次。


walk 的方式分為 TopDown 和 ButtomUp (TopDown=False).

TopDown 的時候,可以刪掉 dirlist 的內容,這樣接下來的 walk 就不會進去..
import os

for rootdir,dirlist,filelist in os.walk('./'):
print rootdir, dirlist, filelist
if '2b' in dirlist:
dirlist.remove('2b')

結果,2b 的內容就不會出現:
./ ['2b', '2'] ['2a']./2b [] ['X']
./2/3 [] ['4b', '4a']
./2 ['3'] ['3a']
./ ['2b', '2'] ['2a']

只有出現 3 次




ButtomUp 用在要刪除目錄的時候,因為目錄是空的就不能刪除,
所以要 ButtomUp..

上面的目錄結構用 os.walk('.',topdown=False) 結果是
./2b [] ['X']
./2/3 [] ['4b', '4a']
./2 ['3'] ['3a']
./ ['2b', '2'] ['2a']

xml.dom.minidom simple parsing

import xml.dom.minidom

xmlroot = xml.dom.monodom.parse('./.repo/manifest.xml')

這樣 parsing 完,就可以用 xmlroot 這個變數操作。

xml 是階層式的架構,所以每一個 node 都有 childNodes[]。
每個 nodes 還有 attribute。


for node in xml.childnodes:
if node.Name == 'project':
print node.getAttribute('path')

印出所有第一階, node name 是 project 的 path

No Module named dom.midom

File "xml.py", line 1, in <module>
from xml.dom.minidom import parse, parseString
File "/home/charles-chang/test/python/xml.py", line 1, in <module>
from xml.dom.minidom import parse, parseString
ImportError: No module named dom.minidom

問題出在 filename : xml.py 跟 python module 內 xml.dom.minidom 所在 module : xml.py 同名。

所以就 load 不到 system 的 xml.py..

解決方法就是 rename 掉你自己的 xml.py,還要注意 rm 目錄下的 xml.pyc

2011年3月23日

subprocess.Popen

在 C code 可以用 Popen(cmd ) fork 一個 thread 來 run 'cmd' 。
這個動作在 Python 就是用 subprocess 這個 module 來達成

import subprocess
args = ['ls']
proc = subprocess.Popen(args)


proc 就是 fork 出來的 thread,可以用這個來控制thread.


proc.wait()
print "done"


等待剛剛的 subprocess.Popen( ) 完成。

Code Reading : repo

repo 是 google 為管理 android source code 的 一堆 git project 所寫出來的 tool。
個 tool 是用 python 寫的。

repo 的 執行本體是一個 shell script,
repo 執行到
"""exec" python -E "$0" "$@"""
後,便叫起 python 來 run 自己,

同時,exec 的作法是取代掉目前的 process,所以後面的 code shell 不會再執行了。

而 python 啟動後,前面的 shell comand 會被認為是 comment 或是字串,所以忽略。

而 repo 的 exec command 後面開始就都是 python code.