标签归档 python

[转载]Python 的虛擬環境及多版本開發利器─Virtualenv 與 Pythonbrew

Virtualenv 和 Pythonbrew 都是可以創造虛擬(獨立)Python 環境的工具,只是虛擬(獨立)標的不同。

Virtualenv 可以隔離函數庫需求不同的專案,讓它們不會互相影響。在建立並啟動虛擬環境後,透過 pip 安裝的套件會被放在虛擬環境中,專案就可以擁有一個獨立的環境。

簡而言之,Virtualenv 可以幫你做到:

  • 在沒有權限的情況下安裝新套件
  • 不同專案可以使用不同版本的相同套件
  • 套件版本升級時不會影響其他專案

Pythonbrew 則可以在家目錄中安裝多個 Python,並迅速地切換版本;也可以在指定的 Python 版本下批次測試你的 Python 程式;另外更整合了 Virtualenv。

這篇文章會詳細介紹這兩個工具,讓你在多人開發及多版本開發的環境中更得心應手。 阅读全文

functools模块

在看tornado的源代码的时候发现了functools模块,google一下,发现这里有相关的介绍,很简单,稍微摘录了一下

functools模块提供了两个装饰器。这个模块是Python 2.5后新增的

wraps(wrapped[, assigned][, updated])

total_ordering(cls)

阅读全文

[转]Python:os模块的进程管理

  1. 有两种方式来实现并发性,一种方式是让每个“任务”或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否则,实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待另一个时间片的到来。另一种方式是在在程序中指定多个“执行线程”,让它们在相同的内存空间中工作。这称为“多线程处理”。线程比进程更有效,因为操作系统不必为每个线程创建单独的内存空间。
  2. 阅读全文

[翻译]关于python的“with”声明

从com.lang.python以及其他的一些论坛上看来,一些有经验的python开发者对于在2.5版本新增加的with似乎有一点迷惑。

如同Python的其他方面一样,一旦你了解了with是用来试图解决哪些问题的时候,你会发现其实它很简单。

看看下面的代码片段:

set things up
try:
    do something
finally:
    tear things down

在这里,”set things up” 可以是打开一个文件或者获得一些外部资源,而”tear things down”可能是相对应的关闭打开的文件或者释放或移除一些资源。try-finally结构保证了就算”do something”代码没有真正执行完成,”tear thigs down”部分也总是会被执行。

如果你经常如上面那样编写一些代码,那么将“set things up”和”tear things down“这些代码放到库函数里以便重用是比较方便的。你可以如下面那样作:

def controlled_execution(callback):
    set things up
    try:
        callback(thing)
    finally:
        tear things down

def my_function(thing):
    do something

controlled_execution(my_function)

但上面的代码有一点冗长,特别是在你需要修改局部变量的时候。另一种方法是使用一次性生成器(译者:one-shot generator是这样翻译?),用for-in声明来”包装“这段代码:

def controlled_execution(callback):
    set things up
    try:
        yield thing
    finally:
        tear things down

for thing in controlled_execution():
    do something with thing

当你只想一次性执行一些代码的时候,上面的代码使用循环结构实现仍然有一点奇怪。所以在考虑了一些备选方案后,GvR和python的开发团队最后终于想出了后面的方法,使用对象来代替生成器来控制一个外埔代码片段的行为:

class controlled_execution:
    def __enter__(self):
        set things up
        return thing
    def __exit__(self, type, value, traceback):
        tear thigs down
with controlled_execution() as thing:
    some code

现在,当执行with语句,python解释器评估with后面的表达式,调用该表达式的__enter__方法,并且将__enter__的返回值赋值给as后面的变量,并且不管发生什么,python一定会执行表达式里面定义的__exit__方法。

作为一个额外的好处,__exit__可以在有异常的时候抑制异常或者做一些必要的异常处理。如果是抑制异常的话只要返回true值就可以。比如下面定义的__exit__方法就仅仅判断了TypeError类型的异常,并放弃处理其他所有的异常:

def __exit__(self, type, value, traceback):
    return isinstance(value, TypeError)

在python2.5里面,文件对象已经被预置了__enter__和__exit__方法了:前者简单的返回了文件对象本身而后者则关闭文件:

>>> f = open("x.txt")
>>> f
<open file 'x.txt', mode 'r' at 0x00AE82F0>
>>> f.__enter__()
<open file 'x.txt', mode 'r' at 0x00AE82F0>
>>> f.read(1)
'X'
>>> f.__exit__(None, None, None)
>>> f.read(1)
Traceback (most recent call last):
File "", line 1, in
ValueError: I/O operation on closed file

所以如果要打开一个文件,处理里面的内容并保证关闭打开的文件,你可以简单的这样作:

with open('x.txt') as f:
    data = f.read()
    do something with data

with声明语法看起来不是那么困难,不是吗?

[[补充]]

  1. 如果with后面没带as的话,__enter__返回值将被忽略
  2. __exit__函数的返回值用来指示with-block部分发生的异常是否要re-raise,如果返回False,则会re-raise with-block的异常,如果返回True,则就像什么都没发生

ps:本人不小心看到这篇文章,并很强烈的想做个备份,鉴于是英文的,就自作主张的想翻译一下,可能有很多地方翻译不周到,请指出,谢谢

英文地址:http://effbot.org/zone/python-with-statement.htm

坑爹的用例

今天想在web页面上实现即时输出的效果,于是想到了使用chunked的传输方式来实现,在webpy的官网上找到了这个示例,它利用生成器和yield来实现chunked的输出,官网的示例有一段是这样的:

坑爹的地方就在这里了,,如果完全按照这个示例去做,根本就出不来效果,用httpfox去看请求的那些协议和参数,你会发现,Transfer-Encoding那项会有两个chunked,刚开始我还没怎么注意,直到后来不停尝试才想起这事可能有蹊跷,于是我去掉了web.header(‘Transfer-Encoding’:'chunked’)这段代码,再尝试的时候,发现正常了,效果出来了,看来webpy的http模块已经自动的做了chunked这样格式的解释了,根本不需要再制定。

python一句话开启web server

晚上在虚拟机上想在主机上拷贝一些东西,由于虚拟机上用的是NAT的共享方式,所以通过主机无法找到虚拟机,原本打算通过虚拟机ssh到主机上,发现mac上没装ssh-server无法连接,于是想到直接使用python搭建一个web server,然后通过浏览器访问或者curl直接下载。
python本身自带的SimpleHTTPServer模块,可以快速的在本机上建立一个临时的web server。执行命令如下:python -m SimpleHTTPServer,这样一个web server就开放了,默认端口是8000,如果你想更换端口则可以这样使用python -m SimpleHTTPServer 8888。很方便吧,在浏览器打上http://xx.xx.xx.xx:8000/就能访问到python所运行的当前目录了,想传什么就下吧,方便又快捷。

基于centos上的python2.7安装pysvn

最近需要用到pysvn扩展包,但在cenos上用easy_install安装不了,说找不到该包,使用yum也不行,无奈只好到官网去下载,我下的是1.7.5的源码包,scp到centos后,执行一下操作:

tar zxvf  pysvn-1.7.5.tar.gz

cd pysvn-1.7.5/Source

python setup.py configure

make

cp pysvn /usr/local/python2.7/

安装完成,在终端下使用ipython,输入import pysvn正常,到此该模块安装完成。

ps:源码安装需要你安装subversion-devel包,否则会提示找不到svn_client.h文件

pxssh报错问题

最近正在使用Pexpect的pxssh作一些自动化的东西,前两天在使用pxssh模块的过程中发现一个怪异问题,程序总是自动的报:pexpect .TIMEOUT: Timeout exceeded in read_nonblocking(),很是无解阿,后来放狗搜索,找到了一个解决方案,即查找到pxssh.py这个文件,在def synch_original_prompt(self):方法下的第一个self.read_nonblocking(size=10000,timeout=1)之前增加一下两行代码:

self.sendline()

time.sleep(0.5)

如此以来,这个问题就解决了,现在还没有时间仔细推敲这个问题原因所在,先在这里mark一下,待日后详查。