Virtualenv 和 Pythonbrew 都是可以創造虛擬(獨立)Python 環境的工具,只是虛擬(獨立)標的不同。
Virtualenv 可以隔離函數庫需求不同的專案,讓它們不會互相影響。在建立並啟動虛擬環境後,透過 pip 安裝的套件會被放在虛擬環境中,專案就可以擁有一個獨立的環境。
簡而言之,Virtualenv 可以幫你做到:
- 在沒有權限的情況下安裝新套件
- 不同專案可以使用不同版本的相同套件
- 套件版本升級時不會影響其他專案
Pythonbrew 則可以在家目錄中安裝多個 Python,並迅速地切換版本;也可以在指定的 Python 版本下批次測試你的 Python 程式;另外更整合了 Virtualenv。
這篇文章會詳細介紹這兩個工具,讓你在多人開發及多版本開發的環境中更得心應手。 阅读全文
标签归档 python
[转载]Python 的虛擬環境及多版本開發利器─Virtualenv 與 Pythonbrew
[转]Python:os模块的进程管理
- 有两种方式来实现并发性,一种方式是让每个“任务”或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否则,实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待另一个时间片的到来。另一种方式是在在程序中指定多个“执行线程”,让它们在相同的内存空间中工作。这称为“多线程处理”。线程比进程更有效,因为操作系统不必为每个线程创建单独的内存空间。
[翻译]关于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声明语法看起来不是那么困难,不是吗?
[[补充]]
- 如果with后面没带as的话,__enter__返回值将被忽略
- __exit__函数的返回值用来指示with-block部分发生的异常是否要re-raise,如果返回False,则会re-raise with-block的异常,如果返回True,则就像什么都没发生
ps:本人不小心看到这篇文章,并很强烈的想做个备份,鉴于是英文的,就自作主张的想翻译一下,可能有很多地方翻译不周到,请指出,谢谢
坑爹的用例
今天想在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一下,待日后详查。
