Archive for the 'Python' Category

再次质疑Django+M od_python时对环境 变量的处理

今天在升级一个django开发的系统到V2的时候,
发现~/无法正确的展开成 /home/hackgou.(apache是以hackgou帐号执行的,)
也不会展开成/root(apache是以root启动的) 觉得非常奇怪,
就算是用os.path.expanduser(’~/’)也无济于事。 于是怀疑是os.envrion[’HOME’]不对,
因为expanduser是需要这个变量来展开~/的。 于是使用setenv HOME /home/hackgou/ 可是也不工作,
后来在django/core/handlers/modpython.py的ModPythonHandler中 发现Django开发组已经注意到,
mod_python不理会apache的setENV指令:
# mod_python fakes the environ, and thus doesn’t process SetEnv. This fixes that
os.environ.update(req.subprocess_env)

但是这个和SetEnv DJANGO_SETTINGS_MODULE app.settings 自相矛盾矛盾,真晕,
自己不设置正确的,也不搭理管理员指定的,怎么办?
后来在http://code.google.com/p/modwsgi/wiki/ApplicationIssues找到一些类似的情况,
提到sudo的时候有bug,会导致HOME和root启动的HOME不一样,太好了,我就要这样的bug。
设置hackgou账号的sudo权限,然后用sudo来启动apache,果然所有的expanduser(’~/’)都顺利。
除此之外, 文中提到
import os, pwd os.environ[”HOME”] = pwd.getpwuid(os.getuid()).pw_dir
这样的代码,似乎可以解决这个问题,神啊,我很反感这种做法:
1.django中似乎没有地方可以放置这样的需要这个APP都需要的代码,我的DRY啊
2.Django修改环境变量似乎成了习惯,之前碰到个TIME_ZONE的问题,就是因为修改了APACHE的环境变量,
导致 别的应用环境受到污染,要知道一个apache进程是很多应用共享的, 除了Djano还有别的应用,
比如别的Django应用或者PHP,都有可能在一个相同的APACHE进程空间中处理,
说有可能是因为apache本身的一些设置会出现这些差别,跟py没有关系, 这样会导致他们的工作环境受到污染。
这似乎没有好的方法可以解决这个问题, 对Django或者说对mod_python 的这种拖泥带水的做法感觉非常的不爽。
也不知道有没有更好的更彻底的解决方法?
如果谁知道,能够告诉我那是最好不过的了

from Crypto import Util 出错

在twisted的conch中会使用Crypto
Crypto是pycrypto:http://www.amk.ca/python/code/crypto 中的一个模块。
给python提供许多加密算法支持:
* Hash functions: MD2, MD4, RIPEMD, SHA256.
* Block encryption algorithms: AES, ARC2, Blowfish, CAST, DES, Triple-DES, IDEA, RC5.
* Stream encryption algorithms: ARC4, simple XOR.
* Public-key algorithms: RSA, DSA, ElGamal, qNEW.
* Protocols: All-or-nothing transforms, chaffing/winnowing.
* Miscellaneous: RFC1751 module for converting 128-key keys into a set of English words, primality testing.
* Some demo programs (currently all quite old and outdated).
这些东西以前很多是收到米国出口限制的,不过今非昔比。 使用easy_install就可以很方便的安装并使用了。
原来第一次用的时候也有这个问题。当时解决了,回来就忘了,今天有碰到了,有想了半天!才记起有这回事。
好记性不如烂笔头,还是记一笔的好!

让easy_install构造自己的py thon小天地

在linux环境中玩、用python,常常需要安装额外的一些python lib
但是由于权限的问题,我们一般是无法往系统中/usr/local之类的目录
里面写东西的,而这些额外的lib又非得需要一个site-packages目录来安装
不可,虽然可以指定pure-lib之类的参数,但是很多时候还是会出错,尤其是现在很多python
lib都是使用的setuptools来生成安装包,更是如此要求了,

  1. [gavin@Korea downloads]$ ll /usr/local/python24/lib/python2.4/site-packages/
  2. total 24
  3. drwxr-xr-x  2 root root 4096 Dec 18 16:05 PIL
  4. -rw-r--r--  1 root root    4 Dec 18 16:05 PIL.pth
  5. -rw-r--r--  1 root root  119 Dec 18 14:59 README

这可麻烦了,每个文件都是root的,旁人只能看,
其实这儿有个很好的解决方法:在自己的目录下面,安装一个虚拟的python:
在自己的目录下面建立一些lib、include等等的目录,构成一个独立的python小天地,这样,系统范围内没有的python库,就可以自己动手安装在自己的小天地中
安装,既不需要root权限,又可以满足自己的需求,一举两得。
这些安装步骤,当然不需要我们重新造轮子,下载
http://peak.telecommunity.com/dist/virtual-python.py
这个脚本,使用你喜欢的python(有的环境提供多个python版本,比如DreamHost)
执行一下这个virtual-python.py,就会自动在~/下面建立所需的目录(~/bin、/lib、
~/include),以及所需python版本,以及创建python所依赖的其他的.h头文件、.py库文件等等软链接,而且会在~/bin/下面copy一个可以执行的python文件,以后直接使用这个~/bin/python来执行py程序,它就会自动找到额外安装在小天地中的那些python库了。如果觉得把bin、lib、include放在~下面不好可以给virtual-python.py指定一个–prefix参数:

  1. [gavin@Korea bin]$ python24 virtual-python.py --prefix=~/python-lib
  2. [gavin@Korea bin]$ pwd
  3. /home/gavin/python-lib/bin
  4. [gavin@Korea bin]$ ll
  5. total 2360
  6. -rwxrwxr-x  1 gavin gavin 2404367 Dec 18 16:53 python

会把那些bin、lib、include安装在~/python-lib下面,
这下,你就可以使用easy__install来安装自己额外需要的那些库了,
不过等等先,由于此时使用的easy_install是系统范围的,所以它会把东西安装在
/usr/local之类的目录下,所以我们得给我们自己的环境安装一个easy_install。
下载

  1. wget http://peak.telecommunity.com/dist/ez_setup.py
  2. ~/python-lib/bin/python ez_setup.py
  3. Downloading http://cheeseshop.python.org/packages/2.4/s/setuptools/setuptools-0.6c3-py2.4.egg
  4. Processing setuptools-0.6c3-py2.4.egg
  5. creating /home/gavin/python-lib/lib/python2.4/site-packages/setuptools-0.6c3-py2.4.egg
  6. Extracting setuptools-0.6c3-py2.4.egg to
  7. /home/gavin/python-lib/lib/python2.4/site-packages
  8. Adding setuptools 0.6c3 to easy-install.pth file
  9. Installing easy_install script to /home/gavin/python-lib/bin
  10. Installing easy_install-2.4 script to /home/gavin/python-lib/bin
  11.  
  12. Installed /home/gavin/python-lib/lib/python2.4/site-packages/setuptools-0.6c3-py2.4.egg
  13. Processing dependencies for setuptools==0.6c3
  14. [gavin@Korea downloads]$ ll ~/python-lib/bin/
  15. total 2376
  16. -rwxr-xr-x  1 gavin gavin     298 Dec 18 17:02 easy_install
  17. -rwxr-xr-x  1 gavin gavin     306 Dec 18 17:02 easy_install-2.4
  18. -rwxrwxr-x  1 gavin gavin 2404367 Dec 18 16:53 python

好了,我自己的easy_install已经安装好了,就可以使用它来安装
自己想安装的所有东西了,而且不用担心权限的问题:

  1. [gavin@Korea downloads]$ ll ~/python-lib/lib/python2.4/site-packages/

我好像没有simplejson呢,ok,安装一个,先:

  1. [gavin@Korea downloads]$ ~/python-lib/bin/easy_install simplejson
  2. Searching for simplejson
  3. Reading http://www.python.org/pypi/simplejson/
  4. Reading http://undefined.org/python/#simplejson
  5. Reading http://www.python.org/pypi/simplejson/1.4
  6. Best match: simplejson 1.4
  7. Downloading http://cheeseshop.python.org/packages/2.4/s/simplejson/simplejson-1.4-py2.4.egg#md5=4f18e31fd095cd54e5015e7b7a147093
  8. Processing simplejson-1.4-py2.4.egg
  9. Moving simplejson-1.4-py2.4.egg to
  10. /home/gavin/python-lib/lib/python2.4/site-packages
  11. Adding simplejson 1.4 to easy-install.pth file
  12.  
  13. Installed /home/gavin/python-lib/lib/python2.4/site-packages/simplejson-1.4-py2.4.egg
  14. Processing dependencies for simplejson
  15. [gavin@Korea downloads]$ ll ~/python-lib/lib/python2.4/site-packages/
  16. total 76
  17. -rw-rw-r--  1 gavin gavin   241 Dec 18 17:07 easy-install.pth
  18. lrwxrwxrwx  1 gavin gavin    51 Dec 18 16:53 PIL ->
  19. /usr/local/python24/lib/python2.4/site-packages/PIL
  20. lrwxrwxrwx  1 gavin gavin    55 Dec 18 16:53 PIL.pth ->
  21. /usr/local/python24/lib/python2.4/site-packages/PIL.pth
  22. lrwxrwxrwx  1 gavin gavin    54 Dec 18 16:53 README ->
  23. /usr/local/python24/lib/python2.4/site-packages/README
  24. drwxrwxr-x  4 gavin gavin  4096 Dec 18 17:02 setuptools-0.6c3-py2.4.egg
  25. -rw-rw-r--  1 gavin gavin    29 Dec 18 17:02 setuptools.pth
  26. -rw-rw-r--  1 gavin gavin 35898 Dec 18 17:07 simplejson-1.4-py2.4.egg
  27. [gavin@Korea downloads]$

非常漂亮

  1. [gavin@Korea downloads]$ ~/python-lib/bin/python
  2. Python 2.4.4 (#1, Dec 18 2006, 14:54:46)
  3. [GCC 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> import simplejson
  6. >>> dir(simplejson)
  7. ['JSONDecoder', 'JSONEncoder', '__all__', '__builtins__', '__doc__',
  8. '__file__', '__loader__', '__name__', '__path__', '__version__',
  9. 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'read',
  10. 'scanner', 'write']
  11. >>>

这个法子对使用dreamhost这类的虚拟主机带来的便利是非常好的,所有的都是自己独立的,再也不用担心Django找不到PIL、找不到……出错了,也不需要在fcgi转发程序里面添加一堆的sys.path,美哉!

SQLObject加MySQL的 utf-8解决之道

SQLObject对utf-8的支持一直为很多人所诟病,MySQL对utf-8的支持
在mysqlconnection.py中可以看到SQLObject连接MySQL时的一些细节,
__init__中支持额外的几个参数

  1. self.need_unicode = False
  2.         for key in ("unix_socket", "init_command",
  3.                 "read_default_file", "read_default_group"):
  4.             if key in kw:
  5.                 self.kw[key] = col.popKey(kw, key)
  6.         for key in ("connect_timeout", "compress", "named_pipe", "use_unicode",
  7.                 "client_flag", "local_infile"):
  8.             if key in kw:
  9.                 self.kw[key] = int(col.popKey(kw, key))
  10.         if "charset" in kw:
  11.             self.dbEncoding = self.kw["charset"] = col.popKey(kw, "charset") 
  12.         else:
  13.             self.dbEncoding = None
  14.         if "sqlobject_encoding" in kw:
  15.             self.encoding = col.popKey(kw, "sqlobject_encoding")
  16.         else:
  17.             self.encoding = 'ascii'
  18.         DBAPI.__init__(self, **kw)

其中的read_default_file和sqlobject_encoding会对SQLObject返回结果的编码产生
影响,
sqlobject_encoding 指明返回对象的编码
read_default_file 则指明连接时读取的客户端配置文件,不同平台该文件名字有可能
不一样,比如my.cnf或者my.ini
也就是说,使用MySQL时,需要支持utf-8的话,需要给连接字符串增加如下额外的参数:
sqlobject_encoding=utf-8&read_default_file=my.cnf

合起来便是:

  1. "mysql://username:password@host/db_name?sqlobject_encoding=utf-8&read_default_file=my.cnf"

之后SQLObject便会很好的处理来自MySQL的utf-8字符串了
当然不能忘了在my.ini中添加默认链接所使用的字符编码:

  1. [client]
  2. default-character-set = utf8

SPUG聚会

周日参加了SPUG的聚会,预定14:00开始,我12:00从金桥出发,紧赶慢赶,到达华师大理科大楼A座328楼的时候, 还是错过了开场,都已经开始了!正好撞见Gary正在问一位演讲的Pythoner“有没有什么可以参考的数据可以 说明性能问题”。呵呵,这个我感兴趣——早先玩Plone的时候觉得这个东西在性能方面的确不尽人意,不过本来 benchmark的测试是一门非常讲究的东西,而且考量起来也是比较复杂的,所以这位Pythoner也无法提供准确的数 字,后来向旁边的一位Pythoner(后来得知这是Bruce Wang)打听:台上这位是谁?知道这便是人们口中的老 潘:潘俊勇,呵呵,原来这家伙不如想象中的那么勇哈,瘦精瘦精的,我虽然知道这次演讲的除了潘俊勇之外, 还有网易的沈崴、Movoto.com的陈世欣,我是第一次参加SPUG,自然这些面孔,我都是第一次见着 :P 接下来有些意外的是一位位法国朋友的演讲,意外的是没想到还有来自法国的朋友,更加没有想到的是他们为此 还做了非常充分的准备,这在他们的演示中就可以看出来,而且后来在他们projects show的时候,更是让人大开 眼界:Plone以及完全融入了他们的生活,Python也完全融进了他们的骨髓!呵呵,虽然现在还不知道两位叫什么 :D
在接下来陈世欣的演讲中提到他们公司的运维模式,觉得非常熟悉:和我们公司一样,development在上海、 market在美国。在development方面不同的是他们公司中Python已经完全融入日常工作中了,而且实践也证明: python的这个胶水非常出色,但是在我们公司便不是这样的:放眼望去PHP/Java/C/c++的一片,Python的寥寥耳! Python的应用,其实不是能不能用的问题,更多的恐怕还是后期的运维以及商业风险的问题! 本来打算和我一起参加SPUG的PM——Yong这家伙也临时有事,没法参加, 除了Python方面的东西,陈世欣还提到一个东西:map API,这个东西其实不光google有、yahoo有、那个M$也有, 他提到他们非常广泛的使用这些免费或者商业授权的API,作为业务的分非常重要的数据库,我便想到 最近刚刚 上线的toseeka,两者何其相似!toseeka做的甚至更加过火:除了comment自己的,其余完全是基于web API,随着 网络化的成熟,基于网络的API恐怕得和本地的API扮演的同样的角色了,而且无持久连接的http嫣然是web based API的天然载体,本来这是一个缺陷,现在看来API server就只作response,不用维护持久连接这个特征,反而是一个 好处了!
后来轮到沈崴讲,呵呵,不愧是为老鸟,其中的很多话题都是非常令人着迷的,其中的很多话题,在我这边都是零碎的, 不成系统,他已经可以拿出手给大家指点一二了!可是时间非常有限,ppt(我居然在http: //www.mangbar.com/task/docview/bd18e8290e8d0235010ea12fdd660312 中没有找到他的ppt)中的很多饶有兴趣的话题,大多只蜻蜓点水般三言两语掠过,而且这家伙在list里面有见首不见尾, 憾事!现在想起来对他提到的一个东西比较感到新奇:把Plone作为一个DB Server,一个http session便是一个connection。 呵呵,有点意思!
后面计划中的金庆(正在翻译PP3eD),演讲题目是Python编程之C扩展模块简例。 可是由于时间的原因,也没有看成。
时间也不早了,刚刚从太阳岛回来,膀子一点酸,休息!

Creative Commons License
This work is licensed under a Creative Commons License.