Tuesday, July 26, 2011

一段神奇的 python

代码来源似乎是一个俄国人的 blogger
import os

from subprocess import Popen

pdfs = []

for i in xrange(1, 20):
    p = Popen(['htmldoc', '--webpage', '-f', '%d.pdf' % i, 
            'http://www.djangobook.com/en/2.0/chapter%02d/' % i])
    p.wait()

    if os.path.exists('%d.pdf' % i):
        pdfs.append('%d.pdf' % i)

if len(pdfs) > 0:
    cmds = ['pdftk']
    cmds.extend(pdfs)
    cmds.extend(['cat', 'output', 'all.pdf'])
    p = Popen(cmds)
    p.wait()
其实 code 很简单,开了 20 个进程使用 htmldoc 将 html 转换成为 pdf,然后使用 pdftk 将几个 pdf 文件合并在一起。

几个 http 服务器

python 提供了几个 http 的服务器实现,一个是 BaseHTTPServer,然后有加强版的 SimpleHTTPServer 和 CGIHTTPServer 这么几个。我们往往可以在命令行上通过
$ python -m SimpleHTTPServer 8000
在本地开启一个 http 的服务器。这可以方便调试简单的 HTML 页面。通过 CGI 甚至可以调试复杂一点的 AJAX。

python 另外有一个 django 可以实现一个比较复杂的 HTTP 服务器。后面稍微研究下。

Tuesday, July 5, 2011

python 的 reflection

这里仅仅列几个重要的用法。通过 dir 获得成员和成员函数,通过 callable 判断是否成员函数:
def info(a):
    for m in dir(a):
        if callable(getattr(a, m)):
            print m + ' is member function'
        else:
            print m + ' is a member'
因此将文本转换成为代码一般依靠 getattr。另外可以通过 types 中的 FunctionType 判断是否为函数。

通过将对象的方法放在字符串里面就可以把一些行为 encode 在文件中。

urllib + os 实现代理访问

import os
import urllib

os.environ["all_proxy"] = default_proxy + ':' + str(default_proxy_port)
data = urllib.urlopen( url ).read()
这里的 all_proxy 可以换成 http_proxy、ftp_proxy,all_proxy 是 SOCKS 代理。

通过 urllib 可以直接打开 http/ftp 等链接,并依照环境变量设置代理,非常方便。