显示标签为“Python”的博文。显示所有博文
显示标签为“Python”的博文。显示所有博文

2013年9月17日星期二

OSX10.7 安装mysql-python报错cc1: error: unrecognized command line option

Mac OS X 10.7 安装 mysql-python 报错

cc1: error: unrecognized command line option "-Wno-null-conversion"
error: Setup script exited with error: command 'llvm-gcc-4.2' failed with exit status 1

应该是 llvm-gcc-4.2 的编译器不识别 option 导致的



http://stackoverflow.com/questions/16127493/cc1-error-unrecognized-command-line-option-wno-null-conversion-within-insta


将 mysql_config 里面的相关 option 去掉再次编译就可以了 



Try to Remove cflags -Wno-null-conversion -Wno-unused-private-field in
/usr/local/mysql/bin/mysql_config.
like:
cflags="-I$pkgincludedir  -Wall   -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 "

2013年5月29日星期三

Python egg


Python Enterprise Application Kit(PEAK)的基础知识在本专栏的前两部分中已经进行了介绍:“可爱的 Python: Python Enterprise Application Kit” 和 “深入 PEAK 的新特性”。简而言之,PEAK 是用来在 Python 中进行快速组件开发和代码重用的强大框架。
本文介绍了 setuptools 框架的内容,它是 PEAK 的一个副项目,它提供了比 distutils 更加简单的包管理和发行功能。
setuptools 模块很会 “规避”。例如,如果我们下载一个使用 setuptools 而不是使用 distutils 构建的包,那么安装就应该可以像我们期望的一样工作:通常使用 python setup.py install 就可以。为了实现这种功能,使用 setuptools 绑定在一起的包就会在归档文件中包含一个很小的引导模块 ez_setup.py。此处惟一需要注意的是 ez_setup.py 试图在后台下载并安装所需要的setuptools —— 当然,这需要有一个连接网络的机器。如果 setuptools 早已在本地机器上安装了,那么这个后台步骤就不再需要执行;但是如果它需要手工进行安装,那么很多透明性就都丢失了。不过,大部分系统现在都有一个 Internet 连接了;为没有连接网络的机器多执行几个特殊步骤也并非特别麻烦。
setuptools 的真正优点并不在于实现 distutils 所能实现的功能 —— 尽管它 的确 增强了 distutils 的功能并简化了setup.py 脚本中的内容。setuptools 最大的优势是它在包管理能力方面的增强。它可以使用一种更加透明的方法来查找、下载并安装依赖包;并可以在一个包的多个版本中自由进行切换,这些版本都安装在同一个系统上;也可以声明对某个包的特定版本的需求;还可以只使用一个简单的命令就能更新到某个包的最新版本。给人印象最为深刻的是,即使有些包的开发人员可能还从未考虑过任何 setuptools 兼容性问题,我们依然可以使用这些包。
下面让我们详细探讨一下。
工具 ez_setup.py 是一个简单的脚本,它可以引导 setuptools 中其余部分。有点让人困惑的是,完整 setuptools 包中所提供的 easy_install 脚本与 ez_setup.py 所实现的功能是相同的。不过前者假设 setuptools 早已安装了,因此它会跳过幕后的安装过程。这两个版本都可以接受相同的参数和开关。
这个过程中的第一个步骤是下载一个小脚本 ez_setup.py

清单 1. 下载引导脚本
% wget -q http://peak.telecommunity.com/dist/ez_setup.py

然后,就可以不带任何参数运行脚本来安装 setuptools 中其余部分了(如果不作为一个单独的步骤来执行这个步骤,在首次安装其他包时,它还是会被完成)。会看到类似于下面的内容(当然,这要取决于所使用的版本):

清单 2. 引导 setuptools
% python ez_setup.py
Downloading http://cheeseshop.python.org/packages/2.4/s/
  setuptools/setuptools-0.6b1-py2.4.egg#md5=b79a8a403e4502fbb85ee3f1941735cb
Processing setuptools-0.6b1-py2.4.egg
creating /sw/lib/python2.4/site-packages/setuptools-0.6b1-py2.4.egg
Extracting setuptools-0.6b1-py2.4.egg to /sw/lib/python2.4/site-packages
Removing setuptools 0.6a11 from easy-install.pth file
Adding setuptools 0.6b1 to easy-install.pth file
Installing easy_install script to /sw/bin
Installing easy_install-2.4 script to /sw/bin

Installed /sw/lib/python2.4/site-packages/setuptools-0.6b1-py2.4.egg
Processing dependencies for setuptools

完毕。这就是我们需要确保在系统上安装 setuptools 而需要做的工作。
对于很多 Python 包来说,要安装这些包,需要做的就是将这些包的名字作为一个参数传递给 ez_setup.py 或 easy_install。既然目前已经使用引导脚本加载了 setuptools,那就可以使用内部更加简化的 easy_install(实际上它与我们选择的版本的区别很小)了。
例如,假设希望安装 SQLObject 包。过程非常简单,如清单 3 所示。注意消息中说 SQLObject 依赖于一个名为 FormEncode 的包;所幸的是,这会被很好地解决:

清单 3. 安装一个典型的包
% easy_install SQLObject
Searching for SQLObject
Reading http://www.python.org/pypi/SQLObject/
Reading http://sqlobject.org
Best match: SQLObject 0.7.0
Downloading http://cheeseshop.python.org/packages/2.4/S/
  SQLObject/SQLObject-0.7.0-py2.4.egg#md5=71830b26083afc6ea7c53b99478e1b6a
Processing SQLObject-0.7.0-py2.4.egg
creating /sw/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg
Extracting SQLObject-0.7.0-py2.4.egg to /sw/lib/python2.4/site-packages
Adding SQLObject 0.7.0 to easy-install.pth file
Installing sqlobject-admin script to /sw/bin

Installed /sw/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg
Processing dependencies for SQLObject
Searching for FormEncode>=0.2.2
Reading http://www.python.org/pypi/FormEncode/
Reading http://formencode.org
Best match: FormEncode 0.5.1
Downloading http://cheeseshop.python.org/packages/2.4/F/
  FormEncode/FormEncode-0.5.1-py2.4.egg#md5=f8a19cbe95d0ed1b9d1759b033b7760d
Processing FormEncode-0.5.1-py2.4.egg
creating /sw/lib/python2.4/site-packages/FormEncode-0.5.1-py2.4.egg
Extracting FormEncode-0.5.1-py2.4.egg to /sw/lib/python2.4/site-packages
Adding FormEncode 0.5.1 to easy-install.pth file

Installed /sw/lib/python2.4/site-packages/FormEncode-0.5.1-py2.4.egg

正如可以从这些消息中看到的一样,easy_install 要在 www.python.org/pypi/ 上查找有关这个包的信息,然后查找真正可以下载它的地方(此处 egg 包就在 cheeseshop.python.org 上;后面将介绍有关 egg 的更多内容)。
现在不仅仅可以安装某个包的最新版本(这是默认操作)。如果愿意,还可以为 easy_install 提供一个特定的版本需求。现在让我们尝试安装 SQLObject 的一个 post-beta 版本。

清单 4. 安装某个包的最小版本
% easy_install 'SQLObject>=1.0'
Searching for SQLObject>=1.0
Reading http://www.python.org/pypi/SQLObject/
Reading http://sqlobject.org
No local packages or download links found for SQLObject>=1.0
error: Could not find suitable distribution for
  Requirement.parse('SQLObject>=1.0')

如果(在本文编写时情况就是如此)SQLObject 的最新版本小于 1.0,那么这会什么也不安装。
SQLObject 是可以识别 setuptools 的;但是如果要安装一个尚未兼容 setuptools 的包又该如何呢?例如,在本文之前,我从没有对自己的 “Gnosis Utilities” 使用过 setuptools。不过,现在让我们来尝试安装一下这个包,已知的只有它所在的 HTTP(或 FTP、SVN、CVS)位置(setuptools 可以理解所有这些协议)。我的下载 Web 站点上有各个 Gnosis Utilities 的版本,它们的命名采用了常见的版本风格:

清单 5. 安装不识别 setuptools 的包
% easy_install -f http://gnosis.cx/download/Gnosis_Utils.More/ Gnosis_Utils
Searching for Gnosis-Utils
Reading http://gnosis.cx/download/Gnosis_Utils.More/
Best match: Gnosis-Utils 1.2.1
Downloading http://gnosis.cx/download/Gnosis_Utils.More/
  Gnosis_Utils-1.2.1.zip
Processing Gnosis_Utils-1.2.1.zip
Running Gnosis_Utils-1.2.1/setup.py -q bdist_egg --dist-dir
  /tmp/easy_install-CCrXEs/Gnosis_Utils-1.2.1/egg-dist-tmp-Sh4DW1
zip_safe flag not set; analyzing archive contents...
gnosis.__init__: module references __file__
gnosis.magic.__init__: module references __file__
gnosis.xml.objectify.doc.__init__: module references __file__
gnosis.xml.pickle.doc.__init__: module references __file__
gnosis.xml.pickle.test.test_zdump: module references __file__
Adding Gnosis-Utils 1.2.1 to easy-install.pth file

Installed /sw/lib/python2.4/site-packages/Gnosis_Utils-1.2.1-py2.4.egg
Processing dependencies for Gnosis-Utils

所幸的是 easy_install 可以把这一切都完成得很好。它会查看给定的下载目录,识别出可用的最高版本,展开这个包,然后将其重新打包为 “egg” 格式,后者就可以用来进行安装了。导入 gnosis 现在可以在一个脚本中运行。但是假设现在需要对 Gnosis Utilities 之前的某个特定版本来测试一个脚本又该怎么做呢?这也非常简单:

清单 6. 安装一个 “naive” 包的特定版本
% easy_install -f http://gnosis.cx/download/Gnosis_Utils.More/
  "Gnosis_Utils==1.2.0"
Searching for Gnosis-Utils==1.2.0
Reading http://gnosis.cx/download/Gnosis_Utils.More/
Best match: Gnosis-Utils 1.2.0
Downloading http://gnosis.cx/download/Gnosis_Utils.More/
  Gnosis_Utils-1.2.0.zip
[...]
Removing Gnosis-Utils 1.2.1 from easy-install.pth file
Adding Gnosis-Utils 1.2.0 to easy-install.pth file

Installed /sw/lib/python2.4/site-packages/Gnosis_Utils-1.2.0-py2.4.egg
Processing dependencies for Gnosis-Utils==1.2.0

现在通常已经安装了两个版本的 Gnosis Utilities,当前活动版本是 1.2.0。将活动版本切换回 1.2.1 也非常简单:

清单 7. 在系统范围修改 “活动” 版本
% easy_install "Gnosis_Utils==1.2.1"
Searching for Gnosis-Utils==1.2.1
Best match: Gnosis-Utils 1.2.1
Processing Gnosis_Utils-1.2.1-py2.4.egg
Removing Gnosis-Utils 1.2.0 from easy-install.pth file
Adding Gnosis-Utils 1.2.1 to easy-install.pth file

Using /sw/lib/python2.4/site-packages/Gnosis_Utils-1.2.1-py2.4.egg
Processing dependencies for Gnosis-Utils==1.2.1

当然,这一次只能使一个版本是活动的。不过通过在各个脚本上面放上这样两行类似内容,就可以让脚本选择自己希望使用的版本:

清单 8. 在脚本中使用某个版本的包
from pkg_resources import require
require("Gnosis_Utils==1.2.0")

通过使用上述要求,setuptools 就可以在运行 import 语句时添加一个特定的版本(如果指定了大于比较,就是最新的可用版本)。
我会更希望让用户不需要知道 Gnosis Utilities 的下载目录就可以安装它。这 通常都可以 工作,因为 Gnosis Utilities 在 Python Cheeseshop 上有一个信息清单。不幸的是,因为没有考虑 setuptools ,所以我在 python.org 上为我的 Gnosis Utilities 建立了一个 “不匹配” 的入口 http://www.python.org/pypi/Gnosis%20Utilities/1.2.1。具体地说,这个归档文件是根据类似于 Gnosis_Utils-N.N.N.tar.gz 的模式进行命名的(这些工具也打包成了 .zip 和 .tar.bz2 文件,最新的几个版本还打包成了 win32.exe 的安装程序,所有这些文件 setuptools 都可以很好地处理)。不过 Cheeseshop 上的项目名的拼写与 “Gnosis Utilities” 稍微有点不同。实际上,在 Cheeseshop 的一个很小的管理版本的更改就会将 http://www.python.org/pypi/Gnosis_Utils/1.2.1-a 创建为一个发布后版本。发行版归档文件本身并没有什么变化,不过是在 Cheeseshop 里增加了一点元数据。只需要少量努力,就可以使用更加简单的安装程序(注意,出于测试目的,我运行了一个 easy_install -m 来删除所安装的包)。

清单 9. 简单增加对 setuptools 的识别
% easy_install Gnosis_Utils
Searching for Gnosis-Utils
Reading http://www.python.org/pypi/Gnosis_Utils/
Reading http://www.gnosis.cx/download/Gnosis_Utils.ANNOUNCE
Reading http://gnosis.cx/download/Gnosis_Utils.More/
Best match: Gnosis-Utils 1.2.1
Downloading [...]

我把这个过程剩余的部分忽略掉了,因为这与您前面看到的内容没什么两样。惟一的区别在于 easy_install 要在 Cheeseshop(换言之 www.python.org/pypi/)上寻找可以匹配指定名字的元数据,并使用这些信息来查找真正的下载位置。在这种情况中,所列出的 .ANNOUNCE 文件没有包含任何有帮助的内容,不过 easy_install 还会继续查看另一个所列的 URL,这会证明它是一个下载目录。
egg 是一个包含所有包数据的文件包。在理想情况中,egg 是一个使用 zip 压缩的文件,其中包括了所有需要的包文件。但是在某些情况下,setuptools 会决定(或被开关告知)包不应该是 zip 压缩的。在这些情况下,egg 只是一个简单的未曾压缩的子目录,但是里面的内容是相同的。使用单一的版本可以方便地进行转换,并可以节省一点磁盘空间,但是 egg 目录从功能和组织结构上来说都是相同的。一直使用 JAR 文件的 Java™ 技术的用户会发现 egg 非常熟悉。
由于最新的 Python 版本中(需要 2.3.5+ 或 2.4)导入挂钩的更改,可以简单地通过设置 PYTHONPATH 或 sys.path 并像往常一样导入相应的包来使用 egg。如果希望采用这种方法,就不需要使用 setuptools 或 ez_setup.py 了。例如,在本文使用的工作目录中,我就为 PyYAML 包放入了一个 egg。现在我就可以使用这个包了,方法如下:

清单 10. PYTHONPATH 上的 egg
% export PYTHONPATH=~/work/dW/PyYAML-3.01-py2.4.egg
% python -c 'import yaml; print yaml.dump({"foo":"bar",1:[2,3]})'
1: [2, 3]
foo: bar

不过,PYTHONPATH 的(或者脚本或 Python shell 会话内的 sys.path的)这种操作有些脆弱。egg 的发现最好是在新一点的 .pth 文件中进行。在 site-packages/ 或 PYTHONPATH 中的任何 .pth 文件都会进行解析来执行其他导入操作,其方法类似于检查可能包含包的那些目录位置一样。如果使用 setuptools 来处理包的管理功能,那么在安装、更新、删除包时,就需要修改一个名为 easy-install.pth 的文件。而且可以按照自己喜欢的方式对这个 .pth 进行命名(只要其扩展名是 .pth 即可)。例如,下面是我的 easy-install.pth 文件的内容:

清单 11. 用作 egg 位置配置的 .pth 文件
% cat /sw/lib/python2.4/site-packages/easy-install.pth
import sys; sys.__plen = len(sys.path)
setuptools-0.6b1-py2.4.egg
SQLObject-0.7.0-py2.4.egg
FormEncode-0.5.1-py2.4.egg
Gnosis_Utils-1.2.1-py2.4.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:];
  p=getattr(sys,'__egginsert',0); sys.path[p:p]=new;
  sys.__egginsert = p+len(new)

这种格式有点特殊:它近似于一个 Python 脚本,但却不完全是。需要说明的是,可以在那里添加额外列出的 egg;更好的情况是,easy_install 会在运行时实现这种功能。也可以在 site-packages/ 下创建任意多个 .pth 文件;每个都可以列出有哪些 egg 是可用的。
上面所述的这种安装 setuptools naive 包的能力(请参阅 清单 6)只部分有效。也就是说,包 Gnosis_Utils 的确安装上了,但是并不完整。所有常见的功能都可以工作,但是在自动生成 egg 时却忽略了很多支持文件 —— 大部分是扩展名为 .txt 的文档和扩展名为 .xml 的测试文件(还有一些其他的 README、.rnc、.rng、.xsl 和围绕子包的文件)。在安装时,所有这些支持文件都 “最好要有”,而没有严格要求一定要有。不过,我们仍然希望能够包含所有的支持文件。
Gnosis_Utils 使用的 setup.py 脚本实际上非常复杂。除了列出基本的元数据之外,在第 467 行代码中,它还对 Python 版本的功能和 bug 进行完整测试;解决旧版本的 distutils 中的一些故障;回溯跳过对不支持部分的安装(例如,如果 pyexpat 在 Python 发行版中并没有包括);处理 OS 行结束符的转换;创建多个归档/安装程序类型;根据测试结果重新构建 MANIFEST 文件。能够实现处理这些工作的能力要感谢此包的另外一个维护人员 Frank McIngvale;这些能力可以让 Gnosis_Utils 能成功安装回 Python 1.5.1 的版本,当然前提是需要这么做(早期版本中的功能没有这么丰富)。不过此处我要向大家展示的脚本并没有像 distutils 脚本一样做这么复杂的事情:它只是简单地假设系统中已经安装了一个 “普通的” 最新版本的 Python。即使这么讲,setuptools 能让安装脚本变得如此简单还是非常吸引人。
在第一次尝试时,让我们来创建一个 setup.py 脚本,它是从 setuptools 手册中借用的,并试图使用它来创建一个 egg:

清单 12. setuptools setup.py 脚本
% cat setup.py
from setuptools import setup, find_packages
setup(
    name = "Gnosis_Utils",
    version = "1.2.2",
    packages = find_packages(),
)
% python setup.py -q bdist_egg
zip_safe flag not set; analyzing archive contents...
gnosis.__init__: module references __file__
gnosis.doc.__init__: module references __file__
gnosis.magic.__init__: module references __file__
gnosis.xml.objectify.doc.__init__: module references __file__
gnosis.xml.pickle.doc.__init__: module references __file__
gnosis.xml.pickle.test.test_zdump: module references __file__

这点努力就已经可以起作用;至少可以部分地起作用。使用这几行内容的确可以创建一个 egg,不过这个 egg 与使用easy_install 创建的 egg 有一些相似的缺点:缺乏对不使用 .py 命名的文件的支持。因此让我们再试一次,只是需要稍微再努力一点:

清单 13. 添加缺少的 package_data
from setuptools import setup, find_packages
setup(
    name = "Gnosis_Utils",
    version = "1.2.2",
    package_data = {'':['*.*']},
    packages = find_packages(),
)

这就是需要做的所有操作。当然,根据实际情况,通常希望对它进行一些调整。例如,它可能会列出下面的内容:

清单 14. 打包特定类型文件类型
package_data = {'doc':['*.txt'], 'xml':['*.xml', 'relax/*.rnc']}

这段内容翻译一下就是:将 .txt 文件包括在 doc/ 子包中,将 .xml 文件包括在 xml/ 子包中,将所有 .rnc 文件包括在 xml/relax/ 子包中。
本文实际上只介绍了用支持 setuptools 的发行版可以执行的定制操作的表层的知识。例如,假设您现在有一个发行版(可以是首选的 egg 格式或另外一种归档类型),您就可以使用一个命令将这个归档文件和元数据上载到 Cheeseshop 上。显然,完整的setup.py 脚本应该包含旧版本 distutils 脚本中所包含的同样详细的元数据;为了简单起见,本文跳过了这些内容,但是其参数名与 distutils 是兼容的。
尽管要完全适应 setuptools 所提供的巨大功能需要一些时间,但是实际上它确实可以让维护您自己的包和安装外来包都要比distutils 更加简单。如果您所关心的内容仅仅是安装包,那么您所需要了解的内容在本文的介绍中已经全部包括了;只是您在描述您自己的包时可能会发现一些复杂性,不过仍然没有使用 distutils 那么复杂。

2013年5月2日星期四

django 教程

http://djangobook.py3k.cn/2.0/chapter06/

django: http://red-bean.com/~adrian/django_pronunciation.mp3

1.创建基于 django 的web程序


django-admin.py startproject mysite

startproject 命令创建一个目录,包含4个文件:
1

mysite/
    __init__.py
    manage.py
    settings.py
    urls.py



文件如下:

  • __init__.py :让 Python 把该目录当成一个开发包 (即一组模块)所需的文件。 这是一个空文件,一般你不需要修改它。

  • manage.py :一种命令行工具,允许你以多种方式与该 Django 项目进行交互。 键入python manage.py help,看一下它能做什么。 你应当不需要编辑这个文件;在这个目录下生成它纯是为了方便。
    5

  • settings.py :该 Django 项目的设置或配置。 查看并理解这个文件中可用的设置类型及其默认值。

  • urls.py:Django项目的URL设置。 可视其为你的django网站的目录。 目前,它是空的。

尽管这些的文件很小,但这些文件已经构成了一个可运行的Django应用。


2. urlconf
URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中。


URL配置和松耦合

现在是好时机来指出Django和URL配置背后的哲学: 松耦合 原则。 简单的说,松耦合是一个 重要的保证互换性的软件开发方法。

Django的URL配置就是一个很好的例子。 在Django的应用程序中,URL的定义和视图函数之间是松 耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。 这使得 开发人员可以修改一块而不会影响另一块。

例如,考虑一下current_datetime视图。 如果我们想把它的URL 从原来的 /time/ 改变到 /currenttime/ ,我们只需要快速的修改一下URL配置即可, 不用担心这个函数的内部实现。 同样的,如果我们想要修改这个函数的内部实现也不用担心会影响 到对应的URL。

此外,如果我们想要输出这个函数到 一些 URL, 我们只需要修改URL配置而不用 去改动视图的代码。 在这个例子里,current_datetime被两个URL使用。 这是一个故弄玄虚的例子,但这个方法迟早会用得上。

urlpatterns = patterns('',
    ('^hello/$', hello),
    ('^time/$', current_datetime),
    ('^another-time-page/$', current_datetime),
)
URLconf和视图是松耦合的。 我们将在本书中继续给出这一重要哲学的相关例子。
关于漂亮URL的一点建议
如果你有其它web平台的开发经验(如PHP或Java),你可能会想:嘿!让我们用查询字符串参数吧! 就像/time/plus?hours=3里面的小时应该在查询字符串中被参数hours指定(问号后面的是参数)。
你 可以 在Django里也这样做 (如果你真的想要这样做,我们稍后会告诉你怎么做), 但是Django的一个核心理念就是URL必须看起来漂亮。 URL /time/plus/3/ 更加清晰, 更简单,也更有可读性,可以很容易的大声念出来,因为它是纯文本,没有查询字符串那么 复杂。 漂亮的URL就像是高质量的Web应用的一个标志。
1
Django的URL配置系统可以使你很容易的设置漂亮的URL,而尽量不要考虑它的 反面 。



3.我们把hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。



Pycharm 快捷键

http://www.5luyu.cn/?action=show&id=52

Mac 下 Ctrl 换成 command

Ctrl /
注释(取消注释)选择的行

Shift + Enter
开始新行

Ctrl + Enter
智能换行

TAB Shift+TAB
缩进/取消缩进所选择的行

Ctrl + Alt + I
自动缩进行

Ctrl + Y
删除当前插入符所在的行

Ctrl + D
复制当前行、或者选择的块

Ctrl + Shift + J
合并行

Ctrl + Shift + V
从最近的缓存区里粘贴

Ctrl + Delete
删除到字符结尾

Ctrl + Backspace
删除到字符的开始

Ctrl + NumPad+/-
展开或者收缩代码块

Ctrl + Shift + NumPad+
展开所有的代码块

Ctrl + Shift + NumPad-
收缩所有的代码块

Mac os x Lion 安装MySQLdb for python



第一步安装 mysql
1.到官方下载 http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/mysql-5.5.23-osx10.6-x86_64.dmg
2.安装mysql-5.5.23-osx10.6-x86_64.pkg 并 安装 Mysql.prefPane 偏好设置页面
3.下载mysqldb http://sourceforge.net/projects/mysql-python/files/mysql-python/
4.运行PATH=$PATH:/usr/local/mysql/bin 否则无法找到mysql_config
5.
python setup.py build
python setup.py install
6.最后运行下面命令,否则找不到libmysqlclient.18.dylib
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/

然后就可以正常使用了...

pycharm

    确实比较好用

    PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手。

    同时支持Google App Engine,PyCharm支持IronPython。这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。

    PyCharm用于一般IDE具备的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制

    PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython。

2013年4月30日星期二

Python中的module, library, package


Python中的module的简介

module,中文翻译为:模块
Python中的module,说白了,就是Python文件,而python文件一般后缀为py,所以就是你的xxx.py而已。

library简介

library,中文翻译为:库,也常称为:库文件
之所以此处不说是Python中的library,那是因为,本身library这个词,一般都是针对其他的编译型语言,比如C,C#等语言来说的。
常见的C/C#等语言中的library,一般指的就是:
静态的库文件:xxx.a
动态的库文件:xxx.dll

Python中的Package的简介

package,中文翻译为:包
Python中的package,可以简单的理解为,一组的module,一堆(相关的)module组合而成的;

Python中module和library之间的区别

对于library和module,说白了,都是提供了一定的功能供别人调用。
从这方面来说,也可以理解为:
Python中library等价于module;
只不过,Python中,很少说library,正常的话,都是说module;
所以,简而言之:
  • library多数都是指的是C,C#等语言中的库,库文件;
  • Python中,很少用library这个词;
  • Python中的“库”,“库文件”的叫法,叫做module,模块;
  • 不论你是Python的初学者还是高手,个人建议,都还是继续沿用,官方的,通用的叫法,使用 module这个词,而不要使用用library这个词; 
可以简单理解为:
  • module:单个的模块,一般是单个(偶尔为多个)python文件;
  • package:多个相关的module的组合。肯定是多个,相关的,Python文件的组合;package是用来把相关的模块组织在一起,成为一个整体的;


6.4. Packages
Package 是一组 modules ; Packages 机制使用 “dotted module names” 来结构化组织 Python 模块. 例如模块名 A.B 表示package A 中的模块 B. 就像 module 机制是用来分离不同代码文件中的全局变量名一样, Package机制是用来分离多个module名.

  1. package目录下的 __init__.py 文件用来向 python解析器声明这个目录包含的是一个 package 而不是普通的目录; 这用来防止目录名中含有逗号的情形。 最简单的, 放一个空 __init__.py 文件也行, 但是可以把 package 初始化代码放到 __init__.py 中或者设置 __all__ 变量, 后面会有详细描述.

  2. 用户可以从 package 中导入单个模块, 例如:

  3.     import sound.effects.echo

  4. 将导入子模块 sound.effects.echo, 需要注意的是,需要通过他的全名访问它内部的符号:

  5.     sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

  6. 另一种导入子模块方式:
  7.     from sound.effects import echo
  8. 这样也可以导入子模块 echo, 并其可以不用 package 前缀来访问, 因此可如下调用他的内部符号:
  9.     echo.echofilter(input, output, delay=0.7, atten=4)
  10. 还有一种导入方法,直接就可以导入子模块中的函数或变量:
  11.     from sound.effects.echo import echofilter
  12. 这时可以直接调用子模块 echo 中的 echofilter() 函数:
  13.     echofilter(input, output, delay=0.7, atten=4)
  14. 注意使用 from package import item 这种方式时, 该 item 得是该package的子模块 (或 subpackage) 或是在该package中定义的其他名字, 比如函数, 类 或变量
  15.     1. import 语句首先确定该符号是否在package中定义过;
  16.     2. 若没有,则假定该符号是一个模块名并尝试去加载; 
  17.     3. 如果加载失败,则最后抛出一个 ImportError 异常.

  18. 不同的是,在使用 import item.subitem.subsubitem 这种语法时, 除了最末的项外,之前的项都得是package;最末项可以是一个模块或者package,但不能是类,函数  变量.
  1. 6.4.1. Importing * From a Package
  2. 理想情况下,使用 from sound.effects import * 将导入package 下所有的子模块.但实际上这会导致许多的副作用,因此 python 中采用了另一种方法:
  3.    用户显式指定 package 的子模块索引. 则 import 语句使用以下规则:
  4.       如果一个package 的 __init__.py 中定义了 __all__ 列表, 则 __all__ 中指定的所有模块将
  5.          被导入( 调用 from package import * 时). 因此 package开发者负责维护这个列表. 
  6.          当然开发也可决定不支持这种方式. 例如文件 sounds/effects/__init__.py 包含以下代码:
  7.          __all__ = ["echo", "surround", "reverse"]     
  8.          这意味着 from sound.effects import * 将导入在上面指定的那三个模块.

  9.       如果 __init__.py 中未定义 __all__ 变量, 则语句:
  10.          from sound.effects import * 
  11.       不会导入其下的子模块,而只保证该 package ( 为 sound.effects )导入到当前namespace中,并执行了 __init__.py 中的初始化代码,然后导入该 package 中定义的任何符号(在 __init__.py 中定义),包括之前用 import package.module 方式指定的模块. 看以下代码:
  12.         import sound.effects.echo
  13.         import sound.effects.surround
  14.         from sound.effects import *
  15. 这个例子中,模块 echo 和 surround 被导入当前 namespace.

  16. 记住,使用 from Package import 这种导入方法没有任何错误, 这是提倡的一种方式.


  1. 6.4.2. package 内部引用
  2.   package内部的子模块经常需要互相引用. 例如, 模块 surround 要使用 echo 模块. 实际上由于需要经常使用这种引用,  import 语句被设计为首先查找所属package,然后再查找标准模块搜索路径. 因此在 surround 模块中用 import echo 或 from echo import echofilter 来进行引用. 如果要导入的模块在当前package中没有找到, import 语句会在顶级的package 中查找该名字的模块.

  3. 当多个package被组织成结构化的 subpackages (就像上面例子中的 sound package ), 你可使用绝对绝对引用来引用相邻package中的子模块. 例如, 模块 sound.filters.vocoder 需要使用 sound.effects 包中的echo 模块, 就可以使用 from sound.effects import echo 来引用.

  4. 自Python 2.5开始, 除了用上面提到的显式相对导入外, 你还可以用 from module import name 形式的显式相对导入语句. 还可以用 . 开头的显式相对导入形式来指定是当前 package 还是父一级package.
  5. 例如,你可以使用:
  6.     from . import echo
  7.     from .. import formats
  8.     from ..filters import equalizer
  9. 注意,显式和隐式的路径都基于当前模块而言. 因为 main 模块的名字永远是 "__main__", 所以在Python应用程序中的 main 模块中需要一直使用绝对导入.

  10. 6.4.3Packages in Multiple Directories
  11. Packages 支持另一个特殊属性, __path__. 它被初始化为一个列表,每个元素为一个含有  __init__.py 的目录路径. 该变量可以修改,但会影响到该package中此后模块和子模块搜索.

  12. 这个特性较少使用, 它可用来对扩展某个package 中的模块集.