今天继续看paster的流程。在serve.py中的Command解析完命令行参数后,它就会把权力移交到paste.deploy这个包了。
值得注意的是,paster分开成了三个egg的包,而它在python中实际的namespace却是一个,就是paster,很奇怪。机关就在各自的egg-info目录下的namespace_packages,它们的内容都是paster,在它们各自包下的__init__.py中也是都包含有:

import pkg_resources
pkg_resources.declare_namespace('paste')

这样就把这三个egg文件都归到一个名字空间paste下。

再返回到paste.deploy这个包,调用它的loadapp和loadserver,它俩又是从哪开始调入呢?
在paste.deploy下有__init__.py中,有:

from loadwsgi import *
from config import CONFIG

loadwsgi.py中有loadapp,loadserver两个函数。分别对应着.ini配置文件中的[server:main],[app:main]。

在pylons的development.ini中,

[server:main]
use = egg:Paste#http

这个调用的是paste-0.5包下的httpserver.py,

# For paste.deploy server instantiation (egg:Paste#http)
# Note: this gets a separate function because it has to expect string
# arguments (though that's not much of an issue yet, ever?)
def server_runner(wsgi_app, global_conf, *args, **kwargs):
    """
    A simple HTTP server.  Also supports SSL if you give it an
    ``ssl_pem`` argument, see documentation for ``serve()``.
    """
    serve(wsgi_app, *args, **kwargs)

注意egg:Paste#http,但我现在还没有看出来从哪个入口进来?有空再看看。

哈哈,刚刚说等会再看,稍微瞄了一下loadwsgi.py中有EggLoader(),这个class会去找前面曾经提到的egg包下的entry_points.txt,这里就有

[paste.server_runner]
 http = paste.httpserver:server_runner

而paste.server_runner在_Server()中有入口,是作为egg的protocol进行调用。