Showing posts with label previous article. Show all posts
Showing posts with label previous article. Show all posts

Tuesday, April 29, 2008

A powerful Python Graph lib

In recnet days,I want to add some chart in my application,for example,financial report chart.so I shearch many python chart lib,such as pygooglechart,Flashchart,Matplotlib.In the end,I found matplotlib is what I want,it's a python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. and it's power full,also it's docuemnt and example is very readable and exhaustive,so I decided to use it in my project.

Some screenshot:

Monday, August 28, 2006

2.1创建最终的hello.py程序

创建最终的hello.py程序

现在你已经具备了一定的基础知识,下面让我们创建一个最终版本的wxPython应用程序,创建一个名为hello.py的文件,键入下面的代码。

列表1.3最终的应用程序代码。

#!/usr/bin/env python
"""Hello ,WxPython Program"""
import wx
class Frame(wx.Frame):
    """Frame class that display an image"""
    def __init__(self,image,parent=None,id=-1,pos=wx.DefaultPosition,title='Hello,WxPython'):
        """create a Frame instance and display an image"""
        temp = image.ConvertToBitmap()
        size = temp.GetWidth(), temp.GetHeight()
        wx.Frame.__init__(self, parent, id, title, pos, size)
        self.bmp = wx.StaticBitmap(parent=self, bitmap=temp)
class App(wx.App):
    """Application class."""
    def OnInit(self):
        image = wx.Image('wxPython.jpg', wx.BITMAP_TYPE_JPEG)
        self.frame = Frame(image)
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True
def main():
    app = App()
    app.MainLoop()
if __name__ == '__main__':
    main()

(1)程序的第一行指出了python解析器所在的位置,以便程序可以执行(如果你使用的unix或者linux操作系统)。
(2)然后定义一个Frame类,它是wx.Frame的子类,这样你可以更方便的操作Frame中的组件。
(3)我们在Frame类的构造函数中增加了一个image参数,用于显示图片对象。
(4)wx.StaticBitmap对象用于显示图片。图片的显示大小视窗口大小而定。
(5)定义一个wx.App的子类App并实现它的OnInit方法。这是实现一个WxPython程序的最小要求。
(6)接下来通过wxPython.jpg这个图片文件创建一个图片对象,这个图片可以从Manning的网站下载,你也可以使用其他图片。
(7)main方法是应用程序的入口。
(8)最后一样检测这个模块是否可以单独执行,你也可以在其他地方调用这个模块,而不是单独执行它。
          很高兴你已经完成了第一个完整的应用程序,你是否看到一个包含图片的窗口?如果没有仔细检查一下你的代码再试一次,如果你看到了我说的那个窗口,恭喜你,你可以准备进入下一章的学习了。

在开始进入下面的学习之前我要再讲讲wxPython到底可以做些什么,如果你对此不感兴趣,希望快点进入下面的学习也没关系。你可以跳过这不部分继续下面的学习。

Tuesday, August 22, 2006

什么是Twisted?

        Twisted是一个事件驱动的网络框架,它由Python写成,基于MIT授权协议。Twisted支持各种各样的底层协议,比如:TCP,UDP,SSL/TLS,多地址传输,Unix socket等,以及HTTP,NNTP,IMAP,SSH,IRC,FTP等其他高级协议。有了这些支持相当于有了一个强有力的基础,你可以用它来开发诸如web server,Mail server,即时通讯软件 等等。

如果将Blob存储到SQLite中

         有时候我们需要将Blob或者二进制文件对象存储到SQLite数据库中,下面这个例子演示了,Python中是如何实现的:

import os
import sqlite

class Blob:
    """Automatically encode a binary string."""
    def __init__(self, s):
        self.s = s

    def _quote(self):
        return "'%s'" % sqlite.encode(self.s)

db = sqlite.connect("test.db")
cursor = db.cursor()
cursor.execute("CREATE TABLE t (b BLOB);")
s = "\0"*50 + "'"*50
cursor.execute("INSERT INTO t VALUES(%s);", Blob(s))
cursor.execute("SELECT b FROM t;")
b = cursor.fetchone()[0]
assert b == s # b is automatically decoded
db.close()
os.remove("test.db")

Python中字符串转换成16进制

      有时候需要将字符串转换成16进制或者将16进制的转换成字符串格式。下面提供两个函数:

#convert string to hex
def toHex(s):
    lst = []
    for ch in s:
        hv = hex(ord(ch)).replace('0x', '')
        if len(hv) == 1:
            hv = '0'+hv
        lst.append(hv)
   
    return reduce(lambda x,y:x+y, lst)

#convert hex repr to string
def toStr(s):
    return s and chr(atoi(s[:2], base=16)) + toStr(s[2:]) or ''

Python 读取键盘输入字符的类

      由于工作需要,需要写一个可以读键盘输入的Python方法,后来在网上找到了一个例子。觉得不错,摘录下来

class _Getch:
    """Gets a single character from standard input.  Does not echo to the screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()


getch = _Getch()

正则表达式之道

     学习Python过程中找到一篇关于正则表达式的文章,感觉比较详细。可以去看看http://net.pku.edu.cn/%7Eyhf/tao_regexps_zh.html

Sunday, August 20, 2006

翻译 Django 安装指南

      翻译来源:www.djangoproject.com/documentation/install
      这篇安装指南涵盖了,从Django0.09到0.95的安装方法。按照本文的讲述,你将开始运行Django。
安装Python
因为Django是一个Python Web框架,所以你必须首先安装Python。Django可以运行在Python2.3以上的版本下。你可以从www.python.org上下载到最新版本,如果你的操作系统是Linux或者Mac OS的话,可能系统已经自带了Python。
安装Apache和Mod_Python
如果你只是想简单了解一下Django可以跳过这一步。Django自带的服务器就足够用了。
如果你希望用Django开发一个产品级的网站,需要使用Apache和mod_python。mod_python 和mod_perl类似,它把Python嵌入到Apache中,并且在Apache启动的时候将Python的代码装载到内存中。确保你安装了Apache和mod_python,Django需要运行在Apache2.x和mod_python 3.x版本下。
你可以查看如何结合mod_python使用Django这篇文章来了解如何配置mod_python。
如果由于某些原因你无法使用mod_python,别担心,Django遵循WSGI规范,遵循这种规范Django可以运行在多个不同的服务器平台上。你可以通过可安装的服务器列表来查看可以安装的每个服务器平台。
让你的数据库运行起来
如果你计划使用Django的数据库API函数,你需要确保你的数据库已经正常运行。Django可以运行在PostqreSQL(推荐),MySQLSQLite
另外,你需要确保你的Python数据库驱动已经安装。
1.如果你使用的是PostgreSQL,你需要安装psycopg包(1.1版本,1.0和2.0版本都不行)。如果你的操作系统是Windows操作系统,你可以下载非官方版本的驱动程序
2.如果你使用的是MySQL,你需要安装MySQLdb
3.如果你使用的是SQLite,你需要安装pysqlite.请安装2.0.3以上的版本。
安装Django代码
根据你下载的Django版本的不同,安装过程也稍有不同。
安装发布版本
1.从下载页面下载Django-0.95.tar.gz。
2.tar xzvf Django-0.95.tar.gz
3.cd Django-0.95
4.sudo python setup.py install
注意,最后一行将自动下载并安装一个安装工具,如果你还没有安装你需要连接到互联网。安装完毕后Django将被自动安装到site-packages目录下。
安装开发版本
1.确保你安装了Subversion
2.svn co http://code.djangoproject.com/svn/django/trunk/ django_src
3.ln -s `pwd`/django_src/django /usr/lib/python2.3/site-packages/django。修改上面的python2.3确保和你当期的Python版本一致。
这种模式下,你不必执行python setup.py install
当你想要更新你的代码时,只要执行svn update就可以了。

转贴 你的团队的最佳人数是多少

(美)沃顿商学院(供《IT时代周刊》专稿)

  在体育界,各个运动队上场的队员数量都很明确:一支篮球队需要5个人,棒球队9个人,足球队11个人。但在工作场所,随着团队合作在不断扩大且复杂化的组织中日益普遍,要确定每支团队的最佳人数则是无章可循。

  据近期《财富》杂志刊登的一篇文章《如何建立一支卓越的团队》所言,4~6人才能实现最高的团队效率,那每个团队若是有5至6人,又会如何?这是沃顿商学院每年为其144个独立的学习团队选择的MBA学生人数。

  沃顿商学院管理学教授珍妮弗·S·缪勒说:“早在社会心理学初创时期,就有人提出团队规模的问题。”她回想起生于1861年的法国农业工程师马克西米利安·林格尔曼,他在早期研究中发现拉绳子的人越多,人均出力越少。大型团队是不是往往因为具有“社会惰性”且缺乏协作而土崩瓦解?

  每个人都很重要

  虽然缪勒的重点研究领域之一是团队规模,但她和沃顿商学院的其他管理学家都认为,在组建一支有效团队时,规模并不一定是首先要考虑的事。

  缪勒说:“第一,问清楚团队即将承担何种任务是很重要的。对此问题的回复将揭示你想聘用什么样的员工以及寻求何种类型的技能,其中有一项就是所需的协调程度。如果是销售团队,那只有在最后才能实现真正的协调。因为它全是单个个体的行为,人与人之间不存在相互依赖。相互依赖很重要,它是你衡量人际关系是否融洽的标准之一。”

  “第二,团队将如何构成?人们在行动中需要运用哪些技能?这包括从工作方式到个人风格到知识基础等等,要确保这一切与任务相适合。”

  “第三,你需要考虑团队规模。” 沃顿商学院管理学教授凯瑟琳·J·克莱因在题为《团队心智模型和团队绩效》的论文中写道,因为团队最佳规模的研究似乎吸引了许多企业和学术机构参与其中, “在过去的10年,由于团队在各种类型的组织中日益普遍,关于团队效率的研究犹如雨后春笋般不断兴起。”

  克莱因在一次访谈中承认,对于团队而言,每个人都很重要。“如果你们是2个成员,那是一个团队还是二元对等体?若是3个人,你会突然有机会进行权力斗争,比如二对一的角力。有些观点认为3人团队与2人团队截然不同,还有人认为偶数团队和奇数团队也有差异。直觉告诉我,当你们的团队达到8或9人以上时,你会发现它臃肿麻烦,派系丛生。喜乎?忧乎?这些都由组织的任务而定。人们感觉到当团队扩大时,就会显露出‘社会惰性’,有人开始得过且过,做一天和尚撞一天钟。”

  林格尔曼著名的“拉绳子”实验——经常称之为“林格尔曼效应”,分析了在拉绳过程中,单个人在群体中的表现。当他让越来越多的人参与拉绳时,他发现尽管总体拉力增加,但每个成员施加的平均拉力减小,这与团队合作时成员更卖力的传统理论相悖。林格尔曼将其归因于当时所谓的“社会惰性”,即一个群体或团队往往会“隐藏着”缺少个人努力的现象。

  缪勒说:“在规模大于5个人后,人们在团队中的拉力发生收益递减。但是除非缺乏动力或承担强制性任务,否则人们不会愿意显露‘社会惰性’。如果你问经理们这个问题,他们会说:‘我正在为偷懒和搭便车的现象烦恼。’偷懒(社会惰性)指的是在群体背景下个人努力的减少,而搭便车则是理性的利己主义行为。如果一个人得不到什么激励,他会说:‘我要搭便车’,即不会积极参与。”

神奇的数字6

  沃顿商学院领导力研究项目主任伊万·维滕贝格强调说,团队规模“并不一定是人们立即考虑的问题,但它确实很重要”。虽然对最佳团队规模的研究 “还没有明确的结论,但是它应该是在5~12个人之间,也有人说5~9个人最妥当,而且赞同6个人是最佳团队规模的声音也不少。”

  维滕贝格补充说,卓越的团队不仅仅取决于最佳规模。比如,沃顿为每个团队分配了5~6个MBA学生。“我们不仅仅是分配那些人。我们必须确认他们都可以有效工作。我们将所有800名学生带到纽约州北部的森林中露营,开展‘学习团队静修’计划,用2天时间组建团队和建立彼此的信赖。我认为这是人们在企业中建立团队经常忘记做的——事先花些时间构筑协同工作制度。我们开始相识,共享个人的核心价值观,这样我们就形成了团队价值观。但更重要的是,我们引领学生朝着集体目标,按照团队准则和办事原则行事。最根本的问题是,我们将要做些什么,将如何做?”

  维滕贝格说,在职场,人们一直强调5~6个人是最适当的(在一个团队内)。至少对我们来说,它让每个人都能充分发挥自己的才能。但坦率地说,我认为这还是取决于具体任务。

  缪勒近期的研究似乎也证实了维滕贝格的观点,即为团队成功所做的准备工作至关重要。几十年来,研究人员注意到团队规模的改变本身能够影响工作组的工作流程和最终绩效。缪勒对来自26个团队的238人进行了研究,这些团队的人数自3到20人不等。她的研究结果验证了团队规模越大,成员绩效越差的论断,但她也对此结论做了解释:“由于有研究显示经理人往往会使团队出现冗员,那么理解团队越大个人表现越差的原因,可能会成为实施成功管理策略的关键所在。此外,个人绩效缺失与其说与协作行为有关,不如说与个体间彼此建立良好友谊来提升个人绩效有密切关系。”

  但是最佳团队规模究竟存在吗?缪勒再次总结说,这取决于任务。“如果你要一组打扫体育场的看门人,那就没有限制;30个人打扫的速度总比5个人快。”但如果公司处理的是协调任务和激励事宜,那么缪勒认为,答案是6个人。她说: “5人或5人以上的组织内,工作动力逐渐消退。在第5个人后,你开始寻找自己的小圈子。有多少人在同一时刻各抒己见呢?在5人或5人以上的组织里更难管理。”

多样化:不利于团结一致?

  克莱因的最新研究探讨了关于团队问题的另一个模糊地带——多样化的价值。有很多理论都指出,性别、种族和年龄的种种差异招致了冲突和极低的社会整合度,而也有其他许多研究则唱反调。克莱因说:“普遍的观点是人以群分,人们总喜欢和自己相似的人,所以有理论提出多样化不利于团结。但是也有一种理论认为,多样化是有利的,因为它激发了更多的思想、更多的角度和更多的创新,从而能得出更好的解决方案。”

  克莱因和林格尔曼各自的研究都发现了团队成员间存在共性的独特价值。两位作者描述了在执行那些复杂的、难以预测的、紧急的任务,或新任务时,团队的心智模型是如何增强协同性和有效性。理论家们指出,在时间紧迫且公开交流和辩论的机会有限时,拥有相似心智模型的团队成员可以预见到彼此的反应,达成有效协作。

  沃顿商学院管理学教授南希·P·罗思巴德也提出了类似理论,她称之为“少数群体”——包括性别、种族、年龄和少数民族。“少数群体看起来通常威胁性不大,因为与你不同的人有不同的见解,这无可厚非。但如果他们与你很相似,但却持不同见解,一些群体会发现这更让人心烦意乱。它可能会使整个团队鸡犬不宁。”

  克莱因对决定谁是团队重要人物的因素进行了调查。最重要的素质是——情绪稳定。“它的反面是神经质。如果有人神经兮兮,容易激动不安,整天忧心忡忡,脾气又很暴躁,这对团队没有任何好处。”

  在公司内部,单个团队之间经常彼此竞争。维腾贝格发现这个问题很棘手:“其中之一是组外和组内的问题。根据我们的自我定位,我们可以是团队内的一部分,或是游离于团队外。在许多公司,工程部门和市场部门常有争执。但同时,如果你谈论的是公司之间的对抗,那么这些团队就会站在一起,它们比其他公司的人拥有更多的共同点。公司内的各个团队有时会较为独立,他们认为他们彼此抗衡而并非受到激励来协同工作。”

  论及如何创建一支成功的团队,维腾贝格说:“懂得人际交流重要性的团队比倚赖电子通讯的团队更为成功。电子邮件是可怕的媒体……它无法很好地传达讽刺或情感,还可能导致误解。面对面地与人交流非常重要,效果迥然不同。”

  团队确实很难创建,而且在无法正常运作时更难修复。那么人们该如何使一个四分五裂的团队重新团结呢?缪勒说:“你要回归到基本问题。这个团队有明确目标吗?团队成员是否各得其所呢?团队任务集中吗?我们开设了团队建设之禁忌的课程,其中目标模糊不清是大忌。另一个禁忌是领导者难以掌控大局,无法组织整个过程。第三,制定团队目标时不可独断专行。任务必须具有一定的意义,人们才会愿意不辞劳苦地为之奔忙。”

Oracle 的函数式索引

当我们在执行查询语句的时候,利用索引可以避免全表搜索,加快查询速度,但是如果你的where子句是这样写的话:where to_char(birth_day,'YYYY-MM-DD') = '1978-11-10' ,而你的索引只是针对birth_day本身,那么这个索引对于你的查询是没有任何效果的,因为你的查询是在函数运算过后再开始比较的。
对于此类方法,一种是把函数写在=号右边,及避免运算后再比较,对于诸如 age/2 > 20 就可以变成 age > 20 * 2 。然而对于无法移动的,例如我们上面的例子,就只能使用函数式索引(function-based index)。
函数式索引创建也很简单,只要在原来填写字段的地方,用函数表达式换上就可以,比如 create index ixbirthday on tPeople ( to_char(birth_day,'YYYY-MM-DD')) 。这样就可以创建一个函数式索引,但是在真正生效之前,我们需要做一些外围的环境设置:
设置启动参数:
QUERY_REWRITE_INTEGRITY must be set to TRUSTED
QUERY_REWRITE_ENABLED must be set to TRUE
COMPATIBLE must set to 8.1.0.0.0 or a greater value
然后在创建索引之后,必须重新分析表 analyze.
至于如何检验你创建的索引是否生效,最直观的方法是比较查询时间,如果你的数据量很大,那差异就会比较明显。另外一个方法是使用EXPLAIN计划。我会在另外一篇文章里来详细说明EXPLAIN表的使用。

千万不能忽视界面需求

现在正在作的一个项目是基于已有系统的重新开发。
原来客户已经在使用一套系统,并行运行了有3年时间了,由于业务扩展的需要,想要对软件升级,但是现在原来的开发商已经不在了,只好重新开发。开始的时候我们没有太多的考虑用户对界面的需求,而是自以为是的设计了新的界面,最后的结果是,客户根本无法接受,界面必须从头改,这真是教训啊,现在调我过来对项目进行改造,真是一件痛苦的差事啊:(.

所以,给我的教训是:

1、如果你作的是一个烂尾的项目,记住不要着急,先回过头来把需求重新理顺。

2、界面需求往往容易背忽视,但是对于已经习惯原有系统的用户来说,界面需求是非常重要的。

3、永远不要认为你已经明白用户需要的是什么了。呵呵

为测试而苦恼

出差在作一个烂尾项目的改造,需要解决的问题很多不说,光是修改后产生的新问题就很头痛,摆在面前的一个问题的缺乏应有的测试,测试对于软件的重要性不言而喻,但是有多少公司是真正重视的啊。今天对测试的感想先记下来以后再逐渐增加。

1、最简单的测试就是程序员自己写完程序要测试是否有问题,然后看看有没有逻辑错误,大多数程序员可以保证第一点,至于逻辑是否正确就因人而异了,用心一点的程序员可以做到,但大部分都做完了事不会注意了。

2、程序员测试之后就是测试人员进行测试了。测试人员要测试必须对需求有足够的了解才能发现问题。对了,还是需求问题。现在大多数程序员和测试人员的测试工作都太表面了,认为只要程序不报错就是没问题了。其实不然啊。

说了这么多,不过是发泄一下,虽然知道问题的所在,但是目前出差人手有限啊。怎么解决这个问题啊,比较棘手啊。公司再派人过来估计是不可能了,考虑是否从现在的人手中再抽一个出来专门作测试。唉,可是一共就3个人啊。哈哈,苦笑一下。

Thursday, August 17, 2006

Google 的Writely可以注册了

http://www.writely.com这里可以注册。试用了一下感觉还不错,并且可以把你写的东西直接发布到blog上。目前还是beta版本。

WxPython 编程指南 1.3 扩展“空壳程序”


上面的这个空壳程序已经让我有了一个好的开始,不过除了用于教学这个程序几乎没什么用处。上面这个程序虽然简单但是难于扩展。

所以我们将扩展这个应用程序,给他添加一些方法和功能。列表1.2列出了我们将要进行的下一个迭代,我们将它命名位spare.py

列表1.2 spare版本的空壳程序

#!/usr/bin/env python

"""Spare.py is a starting point for a wxPython program."""

import wx

class Frame(wx.Frame):

pass

class App(wx.App):

def OnInit(self):

self.frame=Frame(parent=None,title="spare")

self.frame.Show()

self.SetTopWindow(self.frame)

return True

if __name__=='__main__':

app=App()

app.MainLoop()

这个版本的程序仍然很简单只有12行,但是我们为其增加了一些重要的部分。上面程序的第一行称为环境变量行。它类似于python的注释行,不过在某些操作系统中比如Linux/Unix操作系统中这行告诉操作系统python解析器的位置。如果这个文件的操作权限是可执行的,那么我们就可以通过命令行来运行这个文件:

spare.py

这行只会在类Unix系统和MacOS中被识别,其他操作系统会忽略它。尽管你可能不不会使用这些操作系统,但是为了保持平台无关性建议还是加上它。第二行是文档字符串它是文档的注释,最终被放在模块的__doc__属性中。Python的文档字符串为程序提供了内省的能力,我们建议你在模块、类和方法的内部尽量使用文档字符串。PyCrustIDE工具可以有效的利用文档字符串为开发提供更多的信息。

在上面的程序中我们还改变了创建Frame对象的方法,较之bare中直接创建Frame对象不同,在这里我们创建了自己的Frame子类。这样的好处是你可以在Frame中增加其他组件。事实上当实际开发的时候你一般会建立一个单独的Frame模块以便可以扩展。

接下来我们在应用程序镇南关增加了frame对象的引用。就像例子中那样你会发现在增加一个对象属性是多么的简单。

之后我们在OnInit方法中调用了App类的SetTopWindow方法,它继承自是wx.App的方法,它告诉应用那个对象是应用程序的主窗口对象。一个wxPython程序中可以有多个窗口但是只能有一个主窗口,那么就可以通过上面的方法来设置那个是主窗口。

最后一部分是Python中的一种习惯用法,它用来判断那个模块是程序的主入口。我们通过判断模块的’__name__’属性来达到这个目的:

if __name__=='__main__':

app=App()

app.MainLoop()

如果要运行的模块已经导入那么它的’__name__’属性和文件名是相同的(不包括扩展名),比如:

>>> import spare

>>> spare.__name__

'spare

但是如果程序已经开始运行,但是模块没有导入,这时Python则使用缺省的名称,把模块的名称设置为缺省的‘__main__,这样我们就有办法直接运行模块。我们利用这个特性将模块当作一个程序运行。

如果之前我们不错测试就直接运行的化会造成模块中的代码冲突,而且也难于测试。

mod_python 可以支持Apache2.2了

      最新的mod_python 3.2.1可以支持Apache2.2 了,赶快下载来看看吧。http://www.modpython.org/:)

发现一个好用的Python IDE

SPE是一个非常好用的开源Python IDE。你开源从http://www.stani.be/python/spe/page_download下载到它的最新版本,目前的版本是0.8.2。这个IDE是基于WxPython技术开发的,在sf.net的站点上你可以找到不同平台的打包下载版本。我下载的windows版本的打包只有1M多一点。它支持语法高亮,语法自动补全,debug等等。

用Python脚本从NASA上下载卫星照片

网上找这段脚本,尽然可以下载卫星照片,根据这段代码的思路应该可以写出更多有用的脚本:

#! /usr/bin/env python

import urllib

SAT_ZOOM_LEVEL = 0.0001389 #Like in request form

def retrieveImage(coordinates, image_size, name):
"""Retrieve satellite images from the Nasa's site"""
request1 = "http://onearth.jpl.nasa.gov/landsat.cgi?"
"zoom=%f&x0=%f&y0=%f&x=%i&y=%i&action=pan&layer=modis%%252Cglobal_mosaic&pwidth=%i&pheight=%i" %
(SAT_ZOOM_LEVEL,
coordinates[0],
coordinates[1],
image_size[0]/2,
image_size[1]/2,
image_size[0],
image_size[1])
for line in urllib.urlopen(request1):
if line.startswith("<td align=left><input type=image src="):
request2 = "http://onearth.jpl.nasa.gov/%s" % (line.split("\"")[1],)
break
urllib.urlretrieve(request2, name)

if __name__ == '__main__':
retrieveImage((60.7376856, 56.5757572), (800,600), "test.jpg")
# Specified coordinates is the point accurately at the image center

Wednesday, August 16, 2006

Python 2.5 的新特性 统一的try/cath/finally

    直到Python2.5之前,try语句的写法一直是两种风格。你可以使用finally 块保证应用总是被执行,或则通过except保证一个或多个异常可以被捕获并处理。你是你不能把多个except结合一个finally使用,因为将他们合并起来从语义上看并不清晰。
   Guido van Rossum一直从事Java的工作,在Java中支持我们上面说的这种结合。所以现在在Python2.5中你可以这样使用:

try:
    block-1 ...
except Exception1:
    handler-1 ...
except Exception2:
    handler-2 ...
else:
    else-block
finally:
    final-block

代码block-1会被执行,如果出现异常那么会先测试是什么异常,如果是Exception1就执行handler-1,如果是Exception2就执行handler-2,否则就执行 else-block,最终finally部分的代码仍然会被执行。

Python 2.5 新特性 把模块当作脚本运行

     python2.4 中有一个-m的运行选项,这个选项可以把模块当作一个脚本直接运行。替代在Python中通过C的方法实现一个拦截器,新版本中把它实现为一个新的模块,runpy。

  runpy模块实现了更高级的导入机制,所以现在你可以在一个包中运行一个模块,比如pychecker.checker。这个模块也支持以前的导入机制,比如压缩模块,这意味着你可以在sys.path中增加一个.zip文件,然后利用-m选项运行一个压缩文件中的代码。

Python 2.5 新增特性 用于Pythong 软件包的元数据支持

     现在可以在Distutils中增加一些简单的支持信息。setup()函数现在又增加了一些必须的参数,同时也有一些参数不在被支持。当你使用sdist命令创建一个源代码发布包的时候,支持信息放在PKG-INFO文件中。

   现在有了另一个新的关键参数,就是download_url,它可以设置为软件包的源文件连接URL。这意味着,软件包可以寻找到包的索引入口,并更加需要下载相关的支持包。
VERSION = '1.0'
setup(name='PyPackage',
      version=VERSION,
      requires=['numarray', 'zlib (>=1.1.4)'],
      obsoletes=['OldPackage']
      download_url=('http://www.example.com/pypackage/dist/pkg-%s.tar.gz'
                    % VERSION),
     )

另一个增强Python包索引的支持来自http://cheeseshop.python.org,它把Python的源代码和二进制文件打包到一个包里。新的下载命令可以从资源所在位置下载最新的软件包。
在一个把更新之前,你需要通过sdit命令创建一个分发程序,之后你就可以通过setup.py来更新你的包了。你还可以通过设置GPG标记来对包进行唯一性标记。