Tuesday, July 12, 2011

Windows 的 Python 加载器

原文链接:A Python Launcher For Windows

Mark Hammond ( pywin32 的作者以及 Windows 版 Python 的长期支持者)写了 PEP 397,描述了 Windows 下的一个新的 Python 加载器。Vinay Sanjip ( logging 模组的作者)最近实现了这个加载器,下载地址是 https://bitbucket.org/vinay.sajip/pylauncher/downloads

该加载器为 Windows 下的 Python 脚本(.py.pyw 文件)提供了选择 Python 版本的功能,从而可以方便地同时使用 Python 2 和 Python 3 两个版本。

Windows 用户可以试着下载并且测试一下这个加载器,帮助 Python 开发人员解决掉剩下的问题。该加载器是以独立应用程序打包的,而且会支持目前可用的所有版本的 Python。我们的目标是一旦有了加载器的最终版,我们就将其集成到 Python 3.3 中,当然我们还会为其他版本的 Python 提供这个加载器的独立安装包。

这个加载器有两个版本,launcher.msi 会将文件安装到 Program Files 目录下,而 launchsys.msi 会将其安装到 Windows 的 System32 文件夹下。我们还为 64 位 Windows 提供了 64 位的安装包。

加载器的一些细节

PEP 397 中有对该加载器的行为的完整说明。简单概括有如下几点:

  • 该加载器提供了两个可执行文件——命令行版本的 py.exe 以及 GUI 版的 pyw.exe
  • 加载器将被注册为 .py.pyw 文件的默认处理工具。
  • 当执行脚本时,加载器会从脚本中寻找 Unix 式样的含 #! (shebang) 的一行,它会识别出 python (系统默认的 Python 版本)、python2 (默认的 Python 2 发行版)、``python3`` (默认的 Python 3 发行版)这几个字样。你还可以为不一样的计算机和不一样的用户定制不同的加载行为。
  • 单独执行 py.exe 命令会调出 Python 的交互式解释器。py.exe 提供命令行参数支持,py -2 会加载 Python 2,py -3 会加载 Python 3,而 py 则会加载系统默认的 Python 版本。

简单的使用说明

安装以后,加载器会将自己与 .py.pyw 文件关联起来。除非你特别干预,脚本在运行时还是会使用默认的 Python 版本,所以你实际使用时将看不到任何变化。如果你经常使用命令行的话,你可以考虑将 .py 添加到你的 PATHEXT 环境变量中,这样你的脚本就不会在独立的命令控制台执行了。

如果要指定脚本使用 Python 2 编译器,只要将脚本的第一行写成如下格式就可以了:

#!/usr/bin/env python2

这样写和 Unix 是兼容的。如果你不需要兼容 Unix,写成 #!python2 也可以。

如果你想要指定脚本使用 Python 3,那你需要为脚本添加:

#!/usr/bin/env python3

你还可以使用下面这些命令启动 Python 解释器:

# Default version of Python
py
# Python 2
py -2
# Python 3
py -3

前提是你已经将 py.exe 加入了你的路径设置。launchsys 版的加载器会为你自动做这个设置,不过 launcher.msi 的安装目录(C:\Program Files\Python Launcher) 需要被手动加到路径中。

进一步阅读

下面的几个 python-dev 邮件组的讨论内容包含了一些关键的内容:

CPython 3.2.1 发布

原文链接:CPython 3.2.1 Released

Python 核心开发组的 Release Manager Georg Brandl 代表 python-dev 团队宣布: CPython 3.2.1 正式发布了。Windows 安装包和 tarball 包在 7 月 10 日已经发布,各位可以考虑升级到这个版本了。

What's New 中列出了 3.2 版中的新增内容,Misc/NEWS 中列出了我们修正了的所有 bug。

如果你在该发行版或者别的发行版中发现了问题,请报告至http://bugs.python.org/。

Wednesday, July 6, 2011

Python 3.2.1 RC2 发布

原文链接:3.2.1 Release Candidate 2 Released

紧跟着六月的新版发布高峰期,Python 3.2.1 的第二个候选发行版已经发布了。自从 5 月 15 日第一个候选发行版发布以来,我们已经修正了 40 多个问题。我们期望大家在自己的项目里测试一下这个候选版,这也是 3.2.1 最终发布前的最后检查了。

修正了哪些问题?

I/O

问题 #1195 已经呆在那里若干年没人碰过了,不过在这个 RC 版里,我们在调用 fgets 前添加了一个简单的清除错误的动作,这就解决了在 input() 中 CTRL-D 会中断 sys.stdin.read() 的问题。另外我们针对问题 #12175readall 方法做了清理,让它在 read() 返回 None 的时候也返回 None,而在无法打开文件时抛出 ValueError

另外我们解决了 #11272 中 Windows 系统下 input() 尾随 \r 的问题,虽然这不是 RC2 新加的内容,这也是对 Windows 下是 input() 的重要修正。这个问题已经被报告很多次,而且影响了很多人(有没有人想起 distutils 的 upload 命令了呢?),所以我们希望 3.2.1 为你解决了这个问题。

Windows

3.2.0 为 Windows 带来一个新功能,也就是 os.symlink 的支持。随之而来的就是 #12084os.stat 检查 Windows 符号链接(symlink)时的问题。所以这次我们修正了多个 stat 函数的内部代码,以解决这个问题。

有一名用户发现 os.path.isdir 的速度很慢,尤其是检查 symlink 的速度比检查正常文件慢一倍,他而且发现和函数依赖 os.stat 有关。虽然 os.path.isdir 不可能是大家的性能瓶颈,但在解释器启动时会被调用很多次,所以在 #11583 里边我们改用了 GetFileAttributes,从而略微提升一下启动的速度。

subprocess 模块

过去如果给了 Popen 一个错误的参数会导致 AttributeError,这个问题是在 #12085 中提交的,而提交者也提供了解决方案。由于 3.2.0 中的一处更改,导致 Popen 无法正确处理空环境变量,具体也就是 env 这个参数。#12383 就是这个问题的报告,而且这个问题提交后就立即被修正了。

更多的更新!

你可以查看完整的 3.2.1 RC2 更新记录,你也可以现在就下载该版本的 Python!

一如既往,请将你发现的问题提交至 http://bugs.python.org 。有了大家的帮助,我们就可以保证新版的质量,谢谢大家。