Posts Tagged ‘Python’

[Google AppEngine] app.yaml的skip_files

Sunday, January 3rd, 2010

app.yaml的skip_files项通过设置正则表达式,设置在Upload过程中不被上传到AppEngine的文件和文件夹。 这个skip_files有默认值:

skip_files: |
 ^(.*/)?(
 (app\.yaml)|
 (app\.yml)|
 (index\.yaml)|
 (index\.yml)|
 (#.*#)|
 (.*~)|
 (.*\.py[co])|
 (.*/RCS/.*)|
 (\..*)|
 )$

如果需要修改默认值,需要在app.yaml中重写skip_files的值。下面的例子加入了.bak和.DS_Store在排除的文件中:

skip_files:
- ^(.*/)?app\.yaml
- ^(.*/)?app\.yml
- ^(.*/)?index\.yaml
- ^(.*/)?index\.yml
- ^(.*/)?#.*#
- ^(.*/)?.*~
- ^(.*/)?.*\.py[co]
- ^(.*/)?.*/RCS/.*
- ^(.*/)?\..*
- ^(.*/)?.*\.bak$
- ^(.*/)?.DS_Store

这个写法跟AppEngine刚刚发布的时候不一样,不清楚是在哪个版本更新中进行了修改。AppEngine的新版本不断的发布,不知道最后的版本会带来什么功能。

介绍一个名为Picky的AppEngine项目,是@livid开发的基于AppEngine的博客应用。源代码在:http://code.google.com/p/project-picky

File Iterator

Saturday, January 2nd, 2010

《Learning Python》中介绍了Iterator Protocol,很多Built-in对象都实现了它。对于语言内部的实现或者其他类型使用Iterator的效率没有测试,只是简单的测试了File Iterator。先是准备了一个330M的文件,然后用推荐的写法和传统的readlines写法读入文件的内容。

传统的写法:

def read_files_readlines():
    print str(datetime.datetime.now())
    data = ''
    f = open('test.data', 'r')
    for line in f.readlines():
        data += line
    print str(datetime.datetime.now())

推荐的写法:

def read_files_iterators():
    data = ''
    print str(datetime.datetime.now())
    for line in open('test.data'):
        data += line
    print str(datetime.datetime.now())

测试的结果使用Iterator在速度上的优势并不明显,只是比readlines函数快了几秒;但是在内存方面Iterator全面胜出,内存最高使用了200M,readlines的方法占用了1000M左右。推荐在Python的代码中使用Iterator的写法,尤其是在web方面的应用。

MySQL-Python在Snow Leopard上安装编译

Thursday, December 10th, 2009

如果不使用port替换系统的Python,那么所有Python的Library都要自己下载安装。当安装MySQL-Python的时候,会说找不到mysql_config。需要到目录下修改setup_posix.py的26行,指定系统的MySQL配置文件的地址,再执行安装的命令就没有问题了。这里我用port安装的mysql5:

mysql_config.path = "/opt/local/bin/mysql_config5"

Django Template使用相对目录

Saturday, November 7th, 2009

在Django中Template目录要求使用绝对路径,但是这样的配置不便于开发,在settings.py文件中也是可以使用相对目录的配置:

import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 
TEMPLATE_DIRS = (
    BASE_DIR + '/templates',
)

[Google AppEngine] Launcher在Snow Leopard上修改Python路径

Saturday, November 7th, 2009

Google AppEngine是在Python 2.5的环境下运行的,Snow Leopard已经把Python环境升级到2.6了,所以运行Google AppEngine Launcher要修改一下Python的环境变量。

用Finder打开当前用户目录下的Library/Preferences目录,双击com.google.GoogleAppEngineLauncher.plist文件,会自动调用系统Property List Editor打开文件。

增加一个新的Key,名字叫做Python,Type是String类型,Value是/usr/bin/python2.5。保存退出后打开Google AppEngine Launcher,启动一个app后,可以在Log Console里面见到:

Python command: /usr/bin/python2.5

PIL没有close()方法

Friday, October 30th, 2009

Python下操作图片的Library非Python Imaging Library (PIL)莫属,使用的时候通过open()方法导入一个图片文件,却没有关闭的close()方法,困惑之余Google之。在Python的邮件列表里面曾经有人问了这个问题,得到的回答是PIL的open不是file的open(),当图片对象不再使用的时候会自动删除,所以不用close()的方法。

如果不相信PIL会及时的释放对象,可以才用如下代码的写法来保证强制关闭文件。

fp = open(filename, "rb")
im = Image.open(fp) # open from file object
im.load() # make sure PIL has read the data
fp.close()

GAE: Task Queue Quota Increase

Tuesday, October 27th, 2009

6月份的时候Google App Engine就推出了Task Queue的功能,今天GAE官方博客宣布免费用户使用Task API的次数每日增加到100K了。还没有用过这个API,不知道100000次是不是够,但是这个10倍Quota的提示确实让人对GAE更有兴趣了。同时付费的用户的Task API最高限额调整为1M次,每个app每秒调用的task次数可以达到10-20个。更让人高兴的是,这个限额将在未来的几个月内继续增长。

可能是Google Wave的开发带动了App Engine的需求增长吧。

python-twitter工程从Subversion迁移到Mercurial

Monday, October 26th, 2009

python-twitter一直托管在Google Code上,最近作者把版本管理系统从Subversion迁移到了Mercurial。原先的Subversion库将不再更新,需要使用hg命令重新获得代码库。

hg clone https://python-twitter.googlecode.com/hg/ python-twitter

使用hg就可以很方便的publish一份自己的change,跟github.com的folk功能应该差不多。