存档

2009年11月 的存档

这是一篇关于pysvn模块的指南.
完整和详细的API请参考 pysvn Programmer’s Reference.
pysvn是操作Subversion版本控制的Python接口模块. 这个API接口可以管理一个工作副本, 查询档案库, 和同步两个.
该API不能创建新的仓库; 只能作用在现有仓库上. 如果你需要创建一个仓库, 请使用Subversion的svnadmin命令.
使用这个API, 你可以check out一份工作拷贝, 添加, 编辑, 和删除工作文件, 和check in, 比较, 或者放弃更改. 仓库属性, 如关键字扩展, 行字符结束, 或者忽略的列表也可以检查和控制.
Subversion 模型
Subversion是一个更新-编辑-提交的模型. 首先在本地建立一个工作副本. 在工作副本上进行修改, 最后提交到中央仓库 (可以是本地或者远程).
这个模型允许多人偶尔会同时修改同一个文件. 大多情况下. Subversion不会干预合并这些不同修改, 如果一个提交失败, 用户或者应用则要重新检查和修改然后再次提交.
常见任务
本节给出一些使用pysvn接口的常用例子. 业务可以会递归的处理目录. 添加参数recurse=False以防止这种行为; 例如, 你可以需要添加内容没有增加一个目录.

check out一份工作副本
import pysvn
client = pysvn.Client()
#check out the current version of the pysvn project
client.checkout(’http://localhost/example/trunk’,
‘./examples/pysvn’)
#check out revision 11 [...]

十一 20th, 2009 | Filed under Python
标签: ,

Cython代码跟Python不一样,必须要编译。
编译经过两个阶段:
* Cython编译.pyx文件为.c文件
* C编译器会把.c文件编译成.so文件(Windows上是.pyd)
以下会分节介绍几种方式来建立你的扩展模块。
注意: -a 选项,如果使用该选项将会为.c文件生成一份很漂亮的HTML文件,双击高亮的章节部分会展开代码,这对理解,优化和调试模块将会非常有帮助。
命令行
从命令行执行Cython编译器,输入选项和.pyx文件列表。
$ cython -a yourmod.pyx
会生成一个yourmod.c文件(指定-a选项会生成一个HTML文件)
编译.c文件取决于你的操作系统,请参考下如何在你的系统写Python扩展模块文档。
下面是一个Linux系统的例子:
$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing \
-I/usr/include/python2.5 -o yourmod.so yourmod.c
gcc需要提供包含的文件和扩展库的链接。
在目录里会生成yourmod.so文件。
现在只需要导入你的yourmod模块就可以了。

Distutils
确保你的系统已经安装好Distutils。
下面假设需要编译的文件叫hello.pyx。
建立一个setup.py的脚本:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("hello", ["hello.pyx"])]

setup(
name = ’Hello world app’,
cmdclass = {’build_ext’: build_ext},
ext_modules = ext_modules
)
在命令行执行:python setup.py [...]

十一 19th, 2009 | Filed under Python
标签: ,

在偶的ubuntu里编写pyrex程序编译成so还是挺爽的,用 timeit.Timer 测试性能提升不少,今天在windows也尝试了一番。
需要的工具有:
- Pyrex http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
- Dev C++ http://www.bloodshed.net/devcpp.html
Pyrex 可以通过easy_install Pyrex来安装。
Dev C++ 安装完在系统环境变量Path里加上Dev C++安装目录/bin 目录。
测试扩展代码:
# file: foo.pyx
“”" simple pyrex module “”"
cdef class Foo:
“”" foo doc … “”"
cdef char *name
def __init__(self, name):
self.name = name
[...]

十一 17th, 2009 | Filed under Python
标签:

MySQL Query Profile MySQL 5.0.37 以上开始支持 MySQL Query Profiler, 可以查询到此 SQL 会执行多少时间, 并看出 CPU/Memory 使用量, 执行过程中 System lock, Table lock 花多少时间等等.
详细可以参见官方文档:Using the New MySQL Query Profiler
启动
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)
测试查询
mysql> select count(*) from client where broker_id=2;
+———-+
| count(*) |
+———-+
| 200 |
+———-+
1 row in set (0.00 sec)
查看profiles
mysql> show [...]

十一 16th, 2009 | Filed under MySQL
标签:

其实MySQL-python安装很简直,以前一直也没在意,今天发觉换了1.2.3新版本,ms蹦出很多问题来了。
做个记录,防止以后有问题无处可查。
一般步骤是:
1. 安装easy_install
shell > wget http://peak.telecommunity.com/dist/ez_setup.py
shell > python ez_setup.py
会自动根据本机的py版本选择对应的egg,安装完可以看到有/usr/bin/easy_install程序了
2. 安装MySQL-python
shell > easy_install MySQL-python
到这里安装算是完成了,不过接下来测试就郁闷了。
在import MySQLdb出现了两个错误:
a). ImportError: libmysqlclient_r.so.15: cannot open shared object file: No such file or directory
这个错误一般解决比较简单,把路径加入到LD_LIBRARY_PATH即可,不过偶的现象比较强,因为没装MySQL,哈哈
b). ImportError: /lib/tls/libc.so.6: version `GLIBC_2.4′ not found
解决这个错误的办法是不用easy_install了,直接下载MySQL-python-1.2.2.tar.gz包,然后就是三步走:
shell > tar zxvf MySQL-python-1.2.2.tar.gz
shell > cd MySQL-python-1.2.2
shell > python setup.py install

十一 10th, 2009 | Filed under Python
标签: ,

看到有人在坛子里询问在GAE如何发布web.py有关问题,就尝试了一把。具体安装和使用过程如下,请对照自己本地路径相应修改:
1. 复制本地对应web.py目录到GAE对应应用目录
比如:D:\Python25\Lib\site-packages\web 到 e:\googleapp\pynotes
2. 写测试代码
app.yaml
application: pynotes
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: home.py
home.py
import web
render = web.template.render(’templates/’)
urls = (
‘/’, ‘index’
)
class index:
def GET(self):
web.header(’Content-type’, ‘text/html’)
name = ’smallfish’
[...]

十一 10th, 2009 | Filed under Python
标签: ,

Mako是什么?Moko是Python写的一个模板库,Python官网python.org用的就是它哦。其他废话也就不累赘了,直接来点代码,方便阅读与了解把。
(Mako官网地址:http://www.makotemplates.org/ ,可以下载安装包,推荐使用easy_install安装)
from mako.template import Template
mytemplate = Template(”hello world!”)
print mytemplate.render()
mytemplate = Template(”hello, ${name}!”)
print mytemplate.render(name=”jack”)
代码可以参考官方doc部分
mytemplate = Template(filename=’/docs/mytmpl.txt’)
print mytemplate.render()
还可以从设置模板为文件,设置filename属性
mytemplate = Template(filename=’/docs/mytmpl.txt’, module_directory=’/tmp/mako_modules’)
print mytemplate.render()
文件还可以缓存到某个目录下,下面的/docs/mytmpl.txt会产生一个py:/tmp/mako_modules/docs/mytmpl.txt.py
from mako.lookup import TemplateLookup
mylookup = TemplateLookup(directories=['/docs'])
mytemplate = Template(”"”<%include file=”header.txt”/> hello world!”"”, lookup=mylookup)
查找模板,方便统一模板路径使用。
mylookup = TemplateLookup(directories=['/docs'], module_directory=’/tmp/mako_modules’)
def serve_template(templatename, **kwargs):
mytemplate = mylookup.get_template(templatename)
print mytemplate.render(**kwargs)
改良了上面的查找方式

mylookup = TemplateLookup(directories=['/docs'], output_encoding=’utf-8′,
[...]

十一 10th, 2009 | Filed under Python
标签:

MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.DictCursor就行。
默认程序:
import MySQLdb
db = MySQLdb.connect(host = ‘localhost’, user = ‘root’, passwd = ‘123456′, db = ‘test’)
cursor = db.cursor()
cursor.execute(’select * from user’)
rs = cursor.fetchall()
print rs
# 返回类似如下
# ((1000L, 0L), (2000L, 0L), (3000L, 0L))
修改后:
import MySQLdb
import MySQLdb.cursors
db = MySQLdb.connect(host = ‘localhost’, user = ‘root’, passwd = ‘123456′, db = ‘test’,
[...]

十一 10th, 2009 | Filed under Python
标签: ,