Jul 24

在GAE中遇到一个很怪的模块导入问题,问题的本质,就像Java的classpath设置一样,是python中导入模块时搜索路径的问题。比如站点目录结果如下:

mysite
├─__init__.py
├─models.py
├─templates [dir]
├─static [dir]
└─check [dir]
      ├─__init__.py
      ├─views.py
      └─models.py

在check目录的views.py中,我想引用根目录中的models.py中的函数,查看网页时,直接报错,找不到导入对

然后觉得很奇怪,就使用相对引用语法,应该能通过编辑器语法检查,但是在AppEngine无法运行。思前想后,应该是sys.path中,代码目录不在模块搜索路径中。搞之,修改django的启动文件,加入:

from os.path import dirname
import sys
sys.path.append(dirname(dirname(__file__)))

然后将sys.path的内容输出到浏览器,发现一个奇怪的现象:第一次访问时,上面加入的搜索路径是存在的;刷新浏览器后,新加的搜索路径莫明其妙的消失了!

万幸的是,根目录还是在搜索路径中的。所以只能灵活灵活地干活了:即将根目录的models.py,放到一个子目录中,然后使用from common.models import YourModuleObjectName,OK!

mysite
├─__init__.py
├─templates [dir]
├─static [dir]
├─common [dir]
│     ├─__init__.py
│     └─models.py
└─check [dir]
      ├─__init__.py
      ├─views.py
      └─models.py
Jul 22

因为办签证,一直以来看了很多签证方面的资料,于是也在写一个签证信息网站,使用django网页开发框架,基于Google AppEngine的主机,还不错的。

总体感觉是,测试版本的产品,使用起来还真麻烦啊!google datastore和数据库使用习惯也不一样,还需要继续摸索。但django的模板系统很喜欢,方便、灵活而强大!同样原因,开发.NET的情况,也非常喜欢MonoRail框架和NVelocity模板系统,:)

嗯,那个签证网站地址是http://visa.appspot.com/

Jan 13

背着笔记本,行走于宿舍和实验室之间,每次都要修改ip,一个要设成静态ip,另外一个是动态ip,小小研究了一下,写了两个脚本来做,以后不用点鼠标了,^_^

脚本lab.bat
netsh interface ip set address “LAN” dhcp
netsh interface ip set dns “LAN” dhcp

脚本lab.bat
netsh interface ip set address “LAN” static 59.66.96.123 255.255.254.0 59.66.96.1 1
netsh interface ip set dns “LAN” static 166.111.8.28 primary
netsh interface ip add dns name=”LAN” addr=166.111.8.29 index=2

其中LAN是我的局域网连接的名称。更详细的解释,参考netsh命令的帮助,或者查看“如何在命令行更改ip地址”。

如果对用Python完成这个工作感兴趣,请看“用Python干实事: 自动修改Windows的IP、网关和DNS设置”,呵呵。

Oct 07

I want to find some technical books about laTeX. There are thousands of technical books on an internal campus FTP server.

Though I’ve written an ftp search eigine using lucene, I am still comfortable to build a pure list of books into a text file. Then just quick search through the text.

With other language, it may take a lot of time. But with python, I just did it in a couple of minutes. The sequence operation, file I/O, and ftplib are amazingly quick to use. Python is so lovely for small tasks. :)

Sep 04

MetaWeblog API是一种给予XML-RPC的应用协议,类似于Atom APILiveJournal API,我们可以通过MetaWeblog API来远程发布、修改日志。Windows Live Spaces提供了对MetaWeblog API的支持,我们可以通过Windows Live Writer来发表日志,也可以通过编程的方式来发表日志。在开始之前,需要一些步骤来启动这个API:

  1. 如果没有Passport帐号,请在www.passport.com注册并获得一个。
  2. 如果还没有space,请在spaces.live.com注册并获得一个。
  3. 登录进入你的space,然后打开Settings(设置),然后打开Email Publishing(电子邮件发布)选项。
  4. 打开电子邮件发布功能。
  5. 选择一个Secret Word。

好了,现在可以开始使用MetaWeblog了,你的用户名就是你space的名字,你的密码就是Secret Word,使用API的地址就是:

https://storage.msn.com/storageservice/MetaWeblog.rpc

如果想了解更多关于这个API的资料,可以参见微软的文档《Windows Live Spaces MetaWeblog API》。

如果想了解如何使用C#、VB.NET开发日志发布程序,请参见MetaWeblog API Code Samples

如果想了解如何使用Python来操作MetaWeblog API,请参见Python文档中的xmlrpclib模块。其实总体来说,还是觉得用Python写最方便。

Aug 31

发信人: MetalSlugX (Nil), 信区: Python

其实就一环境变量的问题,可以有如下选择
Stand alone Python for Windows
http://arctrix.com/nas/python/standalone.html

Movable Python (居然是商业的)
http://www.voidspace.org.uk/python/movpy/

或者
http://blender.bokee.com/5396621.html

www.portablepython.com/site/home/

Aug 26

换了新的虚拟主机,有很多文件需要迁移,其中一个问题是通过FTP把原服务器的文件夹拷贝过去。由于速度的原因,最好直接服务器对服务器拷贝。用FlashFXP的服务器对传发现不行,只好到处找批量下载的shell脚本或者程序。

无果之下,准备动手写一个,用Python中的ftplib模块。这时忽然发现Python安装目录的子目录[Tools/Scripts]里面,有一个ftpmirror.py!Hallelujah!正是我要找的!

它的使用文档是:

Mirror a remote ftp subtree into a local directory tree.

usage: ftpmirror [-v] [-q] [-i] [-m] [-n] [-r] [-s pat]
[-l username [-p passwd [-a account]]]
hostname[:port] [remotedir [localdir]]
-v: verbose
-q: quiet
-i: interactive mode
-m: macintosh server (NCSA telnet 2.4) (implies -n -s ‘*.o’)
-n: don’t log in
-r: remove local files/directories no longer pertinent
-l username [-p passwd [-a account]]: login info (default .netrc or anonymous)
-s pat: skip files matching pattern
hostname: remote host w/ optional port separated by ‘:’
remotedir: remote directory (default initial)
localdir: local directory (default current)

比如,复制远程服务器ftp.somewhere.com上/huashi文件夹及所有内容,保存到本地的/home/frank/huashi下,命令是:

python ftpmirror.py -v -l ftp_login_name -p ftp_password ftp.somewhere.com /huashi /home/frank/huashi

剩下的就是等待了,:D

Jul 21

这个比挺不错的,我最近写dasblog到WordPress的迁移程序,就是用的UliPad,是看了这篇文章才尝试UliPad的,发现是很不错的IDE。

发信人: RunningOn (挥着翅膀的男孩), 信区: Python
标 题: python IDE比较与推荐
发信站: 水木社区 (Mon Jul 16 19:34:58 2007), 转信

我先给一个初步的表格吧,大家如果有什么意见,或有补充,欢迎提出。有些我没有用过,
先不写了。大家讨论并修改后,我再加精置底,希望大家多多出力。
以下是我使用过的python IDE:

python-ide

除了VisualPython只支持Windows,其它都至少支持Win/Linux/Mac。
各项含义:
自动补全:变量/函数名打到一半时,提示可能的完整的变量/函数名。
智能感知:在库/类/对象后打”.”后,提示可能的函数或变量。
调试:分四档,从好用到不好用分别为“类VC”(调试器操作方式与VC/eclipse相似),“
WPDB”(使用WinPdb作为调试器),“用库”(要配合专门的python调试库,即要改代码来配
合调试),最惨的当然是“无”啦。
语法检查:从好用到不好用分别为“存盘时”(存盘时自动检查,也可以在菜单里手动选择
检查),“手动”(在菜单里选择检查),“无”(没有语法检查功能)
开源:分为开源,共享(提供免费试用,然后需要付费),收费三种。目前还没有“收费”这
一类。
推荐度:五星为最推荐,一星为最不推荐

各IDE简介(注意本文发文时间是2007年7月):
IDLE:
装了python就会有这个,大家肯定都用过了,功能还凑合,调试器的使用方法和大家熟悉的
eclipse/Visual Studio很不一样,需要学习和适应。很一般的IDLE,推荐度:★★。
SPE:
全名Stani’s Python Editor。相当不错的IDE,语法高亮、代码折叠、智能感知、自动语法
检查等功能一应俱全,集成wxGlade。可惜没有自动补全功能。开源,可以用svn下载到最新
的源代码,依赖wxPython。推荐度★★★★★。
Ulipad:
前身是NewEdit,和SPE相比,多了自动补全功能,因而比SPE更加方便,不过没有把界面设
计器wxGlade集成进来。开源,可以用svn下载到最新的源代码,依赖wxPython。推荐度★★
★★★。
Boa Constructor:
比起SPE和Ulipad,BOA的编辑功能相当单薄,自动补全与智能感知都要手动,而且没有自动
语法检查,但调试器相当好用。最大的亮点是界面设计器相当好用,比wxGlade要好用得多
。硬伤是对中文支持不好。依赖wxPython。推荐度★★★。
WingIDE:
很不错的商业软件,调试器是类VC/eclipse的,相当好用,而且还支持project组织。但默
认的设置是不支持中文的,要设置一下字体。不开源,而且破解不好找。既然已经有了好用
的开源软件了,又何必再用盗版的呢?推荐度★★★★
Komodo:
由ActiveState公司制作,该公司的ActivePython和ActivePerl可是相当有名。Komodo和
WingIDE一样也是很不错的商业软件,可以说WingIDE有的大部分优点Komodo也有,非常可惜
没有自动补全。还支持宏录制(类似MS Office的宏录制),不过这也只是个噱头。不爽之处
在于相当耗资源,我AMD 64位双核+1G内存+5400转的硬盘的本本,启动它时硬盘闪了足足一
分钟。400$的价格对它来讲贵了点。推荐度★★★★
VIM/emacs + 插件:
Linux我也玩了好几年了,平心而论这两个东东不适合初学(的开发)者。现在Linux已经比较
好用了,不会vim/emacs也不是什么大不了的事了,特别是后者。推荐度★★★。
eclipse + pydev:
能配好pydev很需要人品。用最新的eclipse,在线安装最新pydev(pydev的网站上会有介绍
),成功率会高一些。eclipse非常好用,但pydev不好用,自动补全与智能感知功能都非常
弱,最烦的是容易挂,而且退出eclipse后还需要手动杀进程,Win/Linux下都不例外。不过
它作为调试器倒是非常意外地好使。推荐度★
VisualStudio.Net 2003 + VisualPython:
已经停止维护了,烂就一个字,多说无益,基本不能用。推荐度★

Jul 21

Dasblog is a great blog system. However it’s too new to be perfect. After struggling with it, I finally decide to switch to a mature blog system, i.e. WordPress.

However, it’s not a one-click task. The most important thing is to import previous articles from Dasblog. Again, I found Python is such a beautiful thing! The task was done by 158 lines of python code! The path data went through is very interesting:

blogware XML data -> python data -> xml-rpc data -> http data -> php data -> mysql data

A bit complicated, hehe. Now the new blog address is http://www.frankdu.com/blog. I need time to test the system, and make sure everything works Okay.

May 17

出自:Dive Into Python,Chapter 11.
网址:http://diveintopython.org

有五个你必须关注的 HTTP 重要特性。

11.3.1. 用户代理 (User-Agent)

User-Agent 是一种客户端告知服务器谁在什么时候通过 HTTP 请求了一个 web 页, feed
汇聚或其他类型的 web 服务的简单途径。 当客户请求一个资源时, 应该尽可能明确发起请求的是谁。
以便当产生异常错误时,允许服务器端的管理员与客户端的开发者取得联系。

默认情况下 Python 发送一个通用的 User-Agent: Python-urllib/1.15。 下一节,
您将看到更加有针对性的 User-Agent

11.3.2. 重定向 (Redirects)

有时资源移来移去。 Web 站点重组内容, 页面移动到了新的地址。甚至是 web 服务重组。 原来位于 http://example.com/index.xml 的 feed 汇聚可能被移动到 http://example.com/xml/atom.xml。 或者因为一个机构的扩展或重组,整个域被迁移。 例如,
http://www.example.com/index.xml 可能被重定向到 http://server-farm-1.example.com/index.xml

您每次从 HTTP 服务器请求任何类型的资源时, 服务器的响应中均包含一个状态代码。 状态代码 200
的意思是 “一切正常, 这就是您请求的页面”。 状态代码 404
的意思是 “页面没找到”。 (当浏览 web 时,你可能看到过 404 errors。)

HTTP 有两种不同的方法表示资源已经被移动。 状态代码 302 表示 临时重定向; 这意谓着 “哎呀,
访问内容被临时移动” (然后在 Location: 头部给出临时地址)。 状态代码 301 表示 永久重定向; 这意谓着
“哎呀, 访问内容被永久移动” (然后在 Location:
头部给出新地址)。 如果您获得了一个 302 状态代码和一个新地址, HTTP
规范说您应该使用新地址获取您的请求, 但是下次您要访问同一资源时, 应该使用就地址重试。 但是如果您获得了一个 301 状态代码和一个新地址, 您应该从次使用新地址。

当从 HTTP 服务器接受到一个适当的状态代码时, urllib.urlopen 将自动 “跟踪” 重定向, 但不幸的是,
当它做了重定向时不会告诉你。你将最终获得所请求的数据,却丝毫不会察觉到在这个过程中一个潜在的库 “帮助”
你做了一次重定向操作。因此你将继续不断的使用旧地址, 并且每次都将获得被重定向的新地址。这一过程要往返两次而不是一次: 太没效率了! 本章的后面,
您将看到如何改进这一点,从而适当的且有效率的处理永久重定向。

11.3.3. Last-Modified/If-Modified-Since

有些数据随时都在变化。 CNN.com 的主页经常几分钟就更新。 另一方面, Google.com 的主页几个星期才更新一次 (当他们上传特殊的假日
logo, 或为一个新服务作广告时)。 Web 服务是不变的:通常服务器指导你所请求的数据的最后修改时间,并且 HTTP
为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法。

如果你第二次 (或第三次, 或第四次) 请求相同的数据, 你可以告诉服务器你上一次获得的最后修改日期: 在你的请求中发送了一个 If-Modified-Since 头信息, 它包含了上一次从服务器连同数据所获得的日期。 如果数据从那时起没有改变,
服务器将返回一个特殊的 HTTP 状态代码 304, 这意谓着 “从上一次请求后这个数据没有改变”。 为什么这一点有何进步呢? 因为当服务器发送状态编码 304 时, 不再重新发送数据
您仅仅获得了这个状态代码。 所以当数据没有更新时,你不需要一次又一次地下载相同的数据; 服务器假定你有本地的缓存数据。

所有现代的浏览器都支持最近修改的数据检查。如果你曾经访问过某页, 一天后重新访问相同的页时发现它没有变化, 并奇怪第二次访问时页面加载得如此之快 –
这就是原因所在。 你的浏览器首次访问时会在本地缓存页面内容, 当你第二次访问, 浏览器自动发送 首次访问时从服务器获得的最近修改日期。 服务器简单的返回 304: 没有修改, 因此浏览器就会知道从本地缓存加载页面。 在这一点上,Web 服务也如此智能。

Python 的 URL 库没有提供内置的最近修改数据检查支持, 但是
你可以为每一个请求添加任意的头信息并在每一个响应中读取任意头信息, 从而自己添加这种支持。

11.3.4. ETag/If-None-Match

ETag 是实现与最近修改数据检查同样的功能的另一种方法: 没有变化时不重新下载数据。 其工作原理是: 服务器发送你所请求的数据的同时,发送某种数据的
hash (在 ETag 头信息中) 。 hash 的确定完全取决于服务器。 当第二次请求相同的数据时, 在
If-None-Match: 头信息中将包含 ETag hash, 如果数据没有改变, 服务器将返回 304 状态代码。 与最近修改数据检查相同, 服务器 仅仅 发送 304 状态代码;
第二次将不为你发送相同的数据。 在第二次请求时, 通过包含 ETag hash, 你会告诉服务器,如果 hash 仍旧匹配就没有必要重新发送相同的数据,
因为你还有上一次访问过的数据。

Python 的 URL 库没有对 ETag 的内置支持,
但是在本章后面你将看到如何添加这种支持。

11.3.5. 压缩 (Compression)

最后一个重要的 HTTP 特性是 gzip 压缩。当谈论 HTTP web 服务时, 几乎总是会谈及在网络线路上传输的 XML。XML 是文本,
而且还是相当冗长的文本, 并且文本通常可以被很好地压缩。当你通过 HTTP 请求一个资源时, 可以告诉服务器, 如果它有任何新数据要发送给我时,
请以压缩的格式发送。 在你的请求中包含 Accept-encoding: gzip 头信息, 如果服务器支持压缩,
他将返回由 gzip 压缩的数据并且使用 Content-encoding: gzip 头信息标记。

Python 的 URL 库本身没有内置对 gzip 压缩的支持,
但是你能为请求添加任意的头信息。 Python 还提供了一个独立的 gzip 模块, 它提供了对数据进行解压缩的功能。