命令行金字塔

你的 Pyramid 可以使用各种命令行实用程序控制和检查应用程序。本章记录了这些实用程序。

我们通常将这个实用程序集合称为“p-scripts”,它是“金字塔控制台脚本”的缩写。

每个p-script的命令行使用详细信息在 p* 脚本文档 .

运行P脚本

所有的金字塔控制台脚本都可以运行:

  • 以它的名字
  • 作为python模块

奔跑 p* 脚本名称

金字塔的每个控制台脚本都可以按其名称运行。例如:

$VENV/bin/pserve development.ini --reload

注解

$VENV/bin/ 是我们用来简化金字塔文档的惯例。它代表 bin 虚拟环境中的目录,其中 $VENV 是表示其路径的环境变量。见 安装 Pyramid 在UNIX系统上Why use $VENV/bin/pip instead of source bin/activate, then pip 更多信息。

运行时对python使用自定义参数 p* 脚本

1.5 新版功能.

每个金字塔的控制台脚本 (pservepviews 等等)可以使用 python3 -m ,允许在运行时将自定义参数发送到Python解释器。例如:

python3 -m pyramid.scripts.pserve development.ini --reload

pviews :显示给定URL的匹配视图

参见

另见输出 pviews --help .

对于具有多个视图的大型应用程序,即使您自己定义了所有视图,也很难将视图配置详细信息保存在头脑中。你可以使用 pviews 命令在终端窗口中打印应用程序中给定URL的匹配路由和视图的摘要。这个 pviews 命令接受两个参数。第一个论点 pviews 是应用程序的路径 .ini 文件和节名 .ini 指向应用程序的文件。这应该是格式 config_file#section_name . 第二个参数是要测试匹配视图的URL。这个 section_name 可以省略;如果是,则认为是 main .

下面是使用 traversal

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$VENV/bin/pviews development.ini#tutorial /FrontPage

URL = /FrontPage

    context: <tutorial.models.Page object at 0xa12536c>
    view name:

    View:
    -----
    tutorial.views.view_page
    required permission = view

输出的顶部和底部总是有请求的URL,所有视图都与它们的视图配置详细信息匹配。在本例中,只有一个视图匹配,因此只有一个 View 部分。对于每个匹配视图,将显示关联视图可调用的完整代码路径,以及作为该视图配置一部分的任何权限和谓词。

更复杂的配置可能会生成如下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$VENV/bin/pviews development.ini#shootout /about

URL = /about

    context: <shootout.models.RootFactory object at 0xa56668c>
    view name: about

    Route:
    ------
    route name: about
    route pattern: /about
    route path: /about
    subpath:
    route predicates (request method = GET)

        View:
        -----
        shootout.views.about_view
        required permission = view
        view predicates (request_param testing, header X/header)

    Route:
    ------
    route name: about_post
    route pattern: /about
    route path: /about
    subpath:
    route predicates (request method = POST)

        View:
        -----
        shootout.views.about_view_post
        required permission = view
        view predicates (request_param test)

        View:
        -----
        shootout.views.about_view_post2
        required permission = view
        view predicates (request_param test2)

在这种情况下,我们要处理的是 URL dispatch 应用。此特定URL有两个匹配的路由。首先显示匹配的路由信息,然后显示与该路由关联的任何视图。从第二个匹配的路由输出中可以看到,一个路由可以与多个视图关联。

对于不匹配任何视图的URL, pviews 只需打印出 找不到 消息。

pshell :交互式外壳

参见

另见输出 pshell --help .

一旦安装了用于开发的程序, pip install -e . 您可以使用交互式的python shell在python环境中执行表达式,与应用程序运行“for real”时使用的表达式完全相同。为此,请使用 pshell 命令行实用程序。

论点 pshell 遵循格式 config_file#section_name 在哪里? config_file 是应用程序的路径 .ini 文件和 section_nameapp 中的节名称 .ini 指向应用程序的文件。例如,您的应用程序 .ini 文件可能有 [app:main] 看起来像这样的部分:

1
2
3
4
5
6
7
[app:main]
use = egg:MyProject
pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_templates = true
pyramid.default_locale_name = en

如果是这样,则可以使用以下命令使用名称调用调试shell main 作为节名称:

$VENV/bin/pshell starter/development.ini#main
Python 2.6.5 (r265:79063, Apr 29 2010, 00:31:32)
[GCC 4.4.3] on linux2
Type "help" for more information.

Environment:
  app          The WSGI application.
  registry     Active Pyramid registry.
  request      Active request object.
  root         Root of the default resource tree.
  root_factory Default root factory used to create `root`.

>>> root
<myproject.resources.MyResource object at 0x445270>
>>> registry
<Registry myproject>
>>> registry.settings['pyramid.debug_notfound']
False
>>> from myproject.views import my_view
>>> from pyramid.request import Request
>>> r = Request.blank('/')
>>> my_view(r)
{'project': 'myproject'}

加载的wsgi应用程序将作为 app 全球的。另外,如果加载的应用程序是 Pyramid 没有周围环境的应用程序 middleware , the root 默认返回的对象 root factoryregistryrequest 将可用。

你也可以简单地依靠 main 通过在文件名后省略任何哈希值来默认节名:

$VENV/bin/pshell starter/development.ini

出版社 Ctrl-D 退出交互shell(或 Ctrl-Z 在Windows上)。

延伸外壳

在使用交互式shell时,当您启动 pshell . 为了促进这一点, pshell 会找个特别的 [pshell] 在你的章节 .ini 文件并将后续的键/值对公开给shell。每个键都是一个变量名,在pshell会话中是全局的;每个值都是一个 dotted Python name . 如果指定,则使用特殊键 setup 应该是 dotted Python name 指向接受将加载到shell中的全局字典的可调用文件。这允许每次执行某些自定义初始化代码时, pshell 运行。这个 setup 也可以从命令行使用 --setup 选项,它将覆盖 .ini 文件。

例如,您希望将模型与数据库会话一起公开给shell,以便在实际的数据库上改变模型。这里,我们假设您的模型存储在 myapp.models 包和您正在使用的 pyramid_tm 将请求上的事务管理器配置为 request.tm .

1
2
3
[pshell]
setup = myapp.lib.pshell.setup
models = myapp.models

通过定义 setup 可调用,我们将创建模块 myapp.lib.pshell 包含名为 setup 这将在全球环境暴露于外壳之前接受全球环境。在这里,我们改变了环境的请求,并添加了一个新的值,该值包含了应用程序的WebTest版本,我们可以轻松地向该版本提交请求。这个 setup Callable也可以是一个生成器,它可以包装整个shell生命周期,在shell退出时执行代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# myapp/lib/pshell.py
from contextlib import suppress
from transaction.interfaces import NoTransaction
from webtest import TestApp

def setup(env):
    request = env['request']
    request.host = 'www.example.com'
    request.scheme = 'https'

    env['testapp'] = TestApp(env['app'])

    # start a transaction which can be used in the shell
    request.tm.begin()

    # if using the SQLAlchemy backend from our cookiecutter, the dbsession is
    # connected to the transaction manager above
    env['tm'] = request.tm
    env['dbsession'] = request.dbsession
    try:
        yield

    finally:
        with suppress(NoTransaction):
            request.tm.abort()

当这 .ini 文件已加载,额外变量 models 可立即使用。自从A setup 还指定了Callable,它被执行,并且有新的变量 testapptmdbsession 是公开的,请求被配置为从主机生成URL http://www.example.com . 例如:

$VENV/bin/pshell starter/development.ini
Python 2.6.5 (r265:79063, Apr 29 2010, 00:31:32)
[GCC 4.4.3] on linux2
Type "help" for more information.

Environment:
  app          The WSGI application.
  registry     Active Pyramid registry.
  request      Active request object.
  root         Root of the default resource tree.
  root_factory Default root factory used to create `root`.
  testapp      <webtest.TestApp object at ...>

Custom Variables:
  dbsession
  model        myapp.models
  tm

>>> testapp.get('/')
<200 OK text/html body='<!DOCTYPE...l>\n'/3337>
>>> request.route_url('home')
'https://www.example.com/'
>>> user = dbsession.query(models.User).get(1)
>>> user.name = 'Joe'
>>> tm.commit()
>>> tm.begin()
>>> user = dbsession.query(models.User).get(1)
>>> user.name == 'Joe'
'Joe'

替代外壳

这个 pshell 如果默认的python repl不令人满意,可以使用备用repl轻松地扩展命令。假设您安装了绑定,例如 pyramid_ipython 它通常是自动选择和使用的。您还可以使用 -p choice--python-shell choice 选择权。

$VENV/bin/pshell -p ipython development.ini#MyProject

你可以使用 --list-shells 查看可用外壳的选项。

$VENV/bin/pshell --list-shells
Available shells:
  bpython
  ipython
  python

如果要使用开箱即用不受支持的shell,可以通过在 setup.py

setup(
    entry_points={
        'pyramid.pshell_runner': [
            'myshell=my_app:ptpython_shell_factory',
        ],
    },
)

然后shell工厂应该返回一个接受两个参数的函数, envhelp ,如下所示:

from ptpython.repl import embed

def ptpython_shell_runner(env, help):
    print(help)
    return embed(locals=env)

在 1.6 版更改: 用户定义的shell可以使用入口点注册。在此之前,唯一支持的外壳是 ipythonbpythonpython .

ipythonbpython 已经被转移到各自的包裹中 pyramid_ipythonpyramid_bpython .

设置默认外壳

你可以使用 default_shell 你的选择 [pshell] 指定首选外壳列表的ini部分。

1
2
[pshell]
default_shell = ptpython ipython bpython

1.6 新版功能.

proutes :显示所有应用程序路由

参见

另见输出 proutes --help .

你可以使用 proutes 命令在终端窗口中打印与应用程序相关的路由摘要。很像 pshell 命令(见) pshell :交互式外壳proutes 命令接受一个格式为的参数 config_file#section_name . 这个 config_file 是应用程序的路径 .ini 文件,以及 section_nameapp 中的节名称 .ini 指向应用程序的文件。默认情况下, section_namemain 可以省略。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$VENV/bin/proutes development.ini
Name                       Pattern                     View                                          Method
----                       -------                     ----                                          ------
debugtoolbar               /_debug_toolbar/*subpath    <wsgiapp>                                     *
__static/                  /static/*subpath            dummy_starter:static/                         *
__static2/                 /static2/*subpath           /var/www/static/                              *
__pdt_images/              /pdt_images/*subpath        pyramid_debugtoolbar:static/img/              *
a                          /                           <unknown>                                     *
no_view_attached           /                           <unknown>                                     *
route_and_view_attached    /                           app1.standard_views.route_and_view_attached   *
method_conflicts           /conflicts                  app1.standard_conflicts                       <route mismatch>
multiview                  /multiview                  app1.standard_views.multiview                 GET,PATCH
not_post                   /not_post                   app1.standard_views.multview                  !POST,*

proutes 生成具有四列的表: Name模式View方法 . “名称”列中列出的项是路由名称,“模式”列中列出的项是路由模式,“视图”列中列出的项是当请求与关联的路由模式匹配时将调用的视图可调用的表示,而“方法”列中列出的项是关联的请求方法使用路由名称。视图列可能显示 <unknown> 如果找不到可调用的关联视图。路由名称的“方法”列可以显示 <route mismatch> 如果视图可调用不接受路由的任何请求方法,或者 * 如果视图可调用将接受路由的任何请求方法。如果应用程序中没有配置路由,则当 proutes 执行。

使用时很方便 proutes 命令通常用于配置要查看的列及其顺序。为了促进这一点, proutes 会找个特别的 [proutes] 在你的章节 .ini 文件并将其用作默认值。

例如,您可以删除请求方法并首先放置视图:

1
2
3
4
[proutes]
format = view
         name
         pattern

还可以使用逗号或空格分隔格式:

1
2
3
4
5
[proutes]
format = view name pattern

[proutes]
format = view, name, pattern

如果要临时配置列和顺序,则存在参数 --format ,这是要包含的列的逗号分隔列表。当前可用的格式为 namepatternviewmethod .

ptweens :显示“Tweens”

参见

另见输出 ptweens --help .

A tween 是位于主金字塔应用程序请求处理程序和调用它的wsgi应用程序之间的一点代码。用户可以获取隐式tween排序(调用指定的排序)的表示形式。 pyramid.config.Configurator.add_tween() )以及明确的tween顺序(由 pyramid.tweens 配置设置)使用 ptweens 命令。Tween工厂将在 ptweens 输出。

例如,这里是 ptweens 命令在没有任何显式tweens的情况下针对配置的系统运行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$VENV/bin/ptweens development.ini
"pyramid.tweens" config value NOT set (implicitly ordered tweens used)

Implicit Tween Chain

Position    Name                                                Alias
--------    ----                                                -----
-           -                                                   INGRESS
0           pyramid_debugtoolbar.toolbar.toolbar_tween_factory  pdbt
1           pyramid.tweens.excview_tween_factory                excview
-           -                                                   MAIN

这里是 ptweens 针对配置的系统运行命令 with 在ITS中定义的显式tweens development.ini 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$VENV/bin/ptweens development.ini
"pyramid.tweens" config value set (explicitly ordered tweens used)

Explicit Tween Chain (used)

Position    Name
--------    ----
-           INGRESS
0           starter.tween_factory2
1           starter.tween_factory1
2           pyramid.tweens.excview_tween_factory
-           MAIN

Implicit Tween Chain (not used)

Position    Name
--------    ----
-           INGRESS
0           pyramid_debugtoolbar.toolbar.toolbar_tween_factory
1           pyramid.tweens.excview_tween_factory
-           MAIN

以下是 development.ini 以上使用 ptweens 报告使用了显式tween链的命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[app:main]
use = egg:starter
reload_templates = true
debug_authorization = false
debug_notfound = false
debug_routematch = false
debug_templates = true
default_locale_name = en
pyramid.include = pyramid_debugtoolbar
pyramid.tweens = starter.tween_factory2
                 starter.tween_factory1
                 pyramid.tweens.excview_tween_factory

登记吐温 有关Tweens的更多信息。

prequest :调用请求

参见

另见输出 prequest --help .

你可以使用 prequest 命令行实用程序,用于在不启动服务器的情况下向应用程序发送请求并查看响应正文。

有两个必需的参数 prequest

  • 配置文件/节:遵循格式 config_file#section_name 在哪里 config_file 是应用程序的路径 .ini 文件和 section_nameapp 中的节名称 .ini 文件。这个 section_name 是可选的;默认为 main . 例如: development.ini .
  • 路径:这应该是要在服务器上呈现的资源的URL的非URL引用的路径元素。例如, / .

例如:

$VENV/bin/prequest development.ini /

这将把响应的主体打印到调用它的控制台上。

支持多种选项 prequest . 这些应该在任何配置文件名或url之前。

prequest 有一个 -d (即, --display-headers )选项,打印输出前服务器返回的状态和头:

$VENV/bin/prequest -d development.ini /

这将打印控制台响应的状态、标题和正文。

您可以使用 --header 选项:

$VENV/bin/prequest --header=Host:example.com development.ini /

通过将头文件转换为其CGI/WSGI等效文件(例如, Host=example.com 将插入 HTTP_HOST 标题变量作为值 example.com )倍数 --header 可以提供选项。特殊标题值 content-type 设置 CONTENT_TYPE 在wsgi环境中。

默认情况下, prequest 发送一个 GET 请求。您可以使用 -m (阿卡 --method 选择权。 GETHEADPOSTDELETE 当前支持。当你使用 POST ,的标准输入 prequest 进程用作 POST 身体:

$VENV/bin/prequest -mPOST development.ini / < somefile

pdistreport :显示所有已安装的发行版及其版本

1.5 新版功能.

参见

另见输出 pdistreport --help .

你可以使用 pdistreport 命令显示 Pyramid 使用中的版本、使用中的python版本以及在您的python环境中安装的所有python发行版:

$VENV/bin/pdistreport
Pyramid version: 1.5dev
Platform Linux-3.2.0-51-generic-x86_64-with-debian-wheezy-sid
Packages:
  authapp 0.0
    /home/chrism/projects/foo/src/authapp
  beautifulsoup4 4.1.3
    /home/chrism/projects/foo/lib/python2.7/site-packages/beautifulsoup4-4.1.3-py2.7.egg
# ... more output ...

pdistreport 没有选择。当您遇到问题并且需要比您的环境更熟悉Python打包和分发的人时,它的输出对于粘贴到Pastebin非常有用。

写剧本

所有Web应用程序的核心都是接受请求并返回响应的系统。当一个请求被 Pyramid 应用程序,系统从请求接收状态,该状态稍后将被应用程序代码所依赖。例如,一个 view callable 可能会假设它是针对一个具有 request.matchdict 一个特定的构图,而另一个则假定matchdict的构图不同。

同时,可以方便地编写“在金字塔环境中”工作的python脚本,例如更新 Pyramid 应用。但是,“真实的”金字塔环境没有完全独立于请求的静态状态;您的应用程序(以及金字塔本身)几乎总是依赖于能够从请求中获取信息。当运行一个只从应用程序导入代码并尝试运行它的python脚本时,就没有请求数据,因为没有任何真正的web请求。因此,应用程序的某些部分和一些金字塔API将无法工作。

因此, Pyramid 使在类似于特定环境的环境中运行脚本成为可能 request 到达你 Pyramid 应用。这是通过使用 pyramid.paster.bootstrap() 脚本主体中的命令。

1.1 新版功能: pyramid.paster.bootstrap()

在 1.8 版更改: 增加了 bootstrap 通过自动清除 with 语句。

在最简单的情况下, pyramid.paster.bootstrap() 可与单个参数一起使用,该参数接受 PasteDeploy .ini 将金字塔应用程序的配置表示为单个参数的文件:

from pyramid.paster import bootstrap

with bootstrap('/path/to/my/development.ini') as env:
    print(env['request'].route_url('home'))

pyramid.paster.bootstrap() 返回包含框架相关信息的字典。此词典将始终包含 request 对象作为其 request 关键。

以下键在中可用 env 词典返回者 pyramid.paster.bootstrap()

请求

A pyramid.request.Request 对象,表示脚本的当前请求状态。

应用程序

这个 WSGI 由引导生成的应用程序对象。

这个 resource 你的根 Pyramid 应用。这是由 root factory 在应用程序中配置。

登记处

这个 application registry 你的 Pyramid 应用。

更接近

可用于弹出内部 Pyramid 线程本地堆栈(由 pyramid.threadlocal.get_current_registry()pyramid.threadlocal.get_current_request() )当脚本编写工作完成时。

假设 /path/to/my/development.ini 上面示例中使用的文件如下所示:

[pipeline:main]
pipeline = translogger
           another

[filter:translogger]
filter_app_factory = egg:Paste#translogger
setup_console_handler = False
logger_name = wsgi

[app:another]
use = egg:MyProject

上述引导程序示例加载的配置将使用 [pipeline:main] 默认情况下配置文件的部分。指定 /path/to/my/development.ini 逻辑上等同于指定 /path/to/my/development.ini#main . 在这种情况下,我们将使用包含 app 包裹在粘贴“translogger”中的对象 middleware (将请求记录到控制台)。

您还可以指定一个特定的 部分 在PasteDeploy .ini 要加载的文件,而不是 main

from pyramid.paster import bootstrap

with bootstrap('/path/to/my/development.ini#another') as env:
    print(env['request'].route_url('home'))

上面的示例指定 another apppipelinecomposite PasteDeploy配置文件的部分。这个 app 对象存在于 env 词典返回者 pyramid.paster.bootstrap() 将是 Pyramid router .

更改请求

默认情况下,金字塔将在 env URL字典 http://localhost:80/ . 这意味着在脚本执行期间由金字塔生成的任何URL都将锚定在这里。这通常不是你想要的。

那么我们如何使金字塔生成正确的URL呢?

假设您在应用程序中配置了类似这样的路由:

config.add_route('verify', '/verify/{code}')

您需要通知金字塔环境,WSGi应用程序正在处理来自特定基础的请求。例如,我们想模拟在 https://example.com/prefix ,以确保生成的URL对于我们的部署是正确的。这可以通过改变产生的请求对象来实现,或者更简单地通过构造所需的请求并将其传递到 bootstrap()

from pyramid.paster import bootstrap
from pyramid.request import Request

request = Request.blank('/', base_url='https://example.com/prefix')
with bootstrap('/path/to/my/development.ini#another', request=request) as env:
    print(env['request'].application_url)
    # will print 'https://example.com/prefix'

现在,您可以轻松地使用金字塔的API来生成URL:

env['request'].route_url('verify', code='1337')
# will return 'https://example.com/prefix/verify/1337'

清理

如果你在使用 with -语句变量则无需担心。但是,如果直接使用返回的环境,那么当脚本逻辑完成时,调用 closer 回调:

from pyramid.paster import bootstrap
env = bootstrap('/path/to/my/development.ini')

# .. do stuff ...

env['closer']()

设置日志记录

默认情况下, pyramid.paster.bootstrap() 不配置配置文件中存在的日志参数。如果要根据配置日志记录 [logger] 以及配置文件中的相关部分,使用以下命令:

import pyramid.paster
pyramid.paster.setup_logging('/path/to/my/development.ini')

登录中 有关在中登录的详细信息 Pyramid .

将脚本制作成控制台脚本

“控制台脚本”是 Setuptools 安装到 bin python目录 virtual environment (或“基本”python环境)当 distribution 安装脚本的位置。因为它安装在 bin 虚拟环境的目录安装分发后,它是一种方便的打包和分发功能的方法,您可以从命令行调用这些功能。创建控制台脚本通常比创建 .py 编写脚本并指导人们使用“正确的”Python解释器来调用它。控制台脚本生成的文件 bin 当它被调用时,它将始终使用“正确的”python环境,这意味着它将总是在一个环境中被调用,在这个环境中它所需要的所有库(如pyramid)都可用。

通常,您可以通过执行以下操作将脚本生成控制台脚本:

  • 使用现有分发(例如,您已经通过 cookiecutter )或者创建至少具有一个包或模块的新分发。它应该在发行版中的任何模块中包含一个不带参数的可调用(通常是一个函数),并且运行您希望运行的任何代码。
  • 添加 [console_scripts] 截面到 entry_points 分发的参数,该参数在脚本名和表示添加到分发中的可调用项的点名称之间创建映射。
  • pip install -e .pip install . 重新安装您的发行版。重新安装分发时,表示在最后一步中命名的脚本的文件将位于 bin 安装分发的虚拟环境的目录。它将是可执行的。从终端调用它将执行调用。

作为一个例子,让我们创建一些代码,这些代码可以由一个控制台脚本调用,该脚本打印金字塔应用程序的部署设置。为此,我们将假装您有一个分发包,其中包含一个名为 myproject . 在这个包中,我们将假装您添加了 scripts.py 包含以下代码的模块:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# myproject.scripts module

import optparse
import sys
import textwrap

from pyramid.paster import bootstrap

def settings_show():
    description = """\
    Print the deployment settings for a Pyramid application.  Example:
    'show_settings deployment.ini'
    """
    usage = "usage: %prog config_uri"
    parser = optparse.OptionParser(
        usage=usage,
        description=textwrap.dedent(description)
        )
    parser.add_option(
        '-o', '--omit',
        dest='omit',
        metavar='PREFIX',
        type='string',
        action='append',
        help=("Omit settings which start with PREFIX (you can use this "
              "option multiple times)")
        )

    options, args = parser.parse_args(sys.argv[1:])
    if not len(args) >= 1:
        print('You must provide at least one argument')
        return 2
    config_uri = args[0]
    omit = options.omit
    if omit is None:
        omit = []
    with bootstrap(config_uri) as env:
        settings = env['registry'].settings
        for k, v in settings.items():
            if any([k.startswith(x) for x in omit]):
                continue
            print('%-40s     %-20s' % (k, v))

此脚本使用python optparse 模块,使我们能够理解传递给脚本的额外参数。它使用 pyramid.paster.bootstrap() 函数获取由配置文件定义的应用程序的信息,并打印在该配置文件中定义的部署设置。

将此脚本添加到包后,您需要告诉分发的 setup.py 关于它的存在。在发行版的顶级目录中, setup.py 文件将如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import os

from setuptools import setup, find_packages

here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.txt')) as f:
    README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
    CHANGES = f.read()

requires = ['pyramid', 'pyramid_debugtoolbar']

tests_require = [
    'WebTest',
    'pytest',
    'pytest-cov',
]

setup(name='MyProject',
    version='0.0',
    description='My project',
    long_description=README + '\n\n' +  CHANGES,
    classifiers=[
        "Programming Language :: Python",
        "Framework :: Pyramid",
        "Topic :: Internet :: WWW/HTTP",
        "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
    ],
    author='',
    author_email='',
    url='',
    keywords='web pyramid pylons',
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
    install_requires=requires,
    extras_require={
        'testing': tests_require,
    },
    entry_points = """\
    [paste.app_factory]
    main = myproject:main
    """,
    )

我们要改变 setup.py 添加文件 [console_scripts] 段内的 entry_points 字符串。在本节中,应指定 scriptname = dotted.path.to:yourfunction 线。例如:

[console_scripts]
show_settings = myproject.scripts:settings_show

这个 show_settings name will be the name of the script that is installed into bin. The colon (:) between `` myproject.scripts``和 settings_show 上面表示 myproject.scripts 是一个python模块,并且 settings_show 是该模块中的函数,其中包含您希望作为调用 show_settings 从命令行编写脚本。

结果是:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os

from setuptools import setup, find_packages

here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.txt')) as f:
    README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
    CHANGES = f.read()

requires = ['pyramid', 'pyramid_debugtoolbar']

tests_require = [
    'WebTest',
    'pytest',
    'pytest-cov',
]

setup(name='MyProject',
    version='0.0',
    description='My project',
    long_description=README + '\n\n' +  CHANGES,
    classifiers=[
        "Programming Language :: Python",
        "Framework :: Pyramid",
        "Topic :: Internet :: WWW/HTTP",
        "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
    ],
    author='',
    author_email='',
    url='',
    keywords='web pyramid pylons',
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
    install_requires=requires,
    extras_require={
        'testing': tests_require,
    },
    entry_points = """\
    [paste.app_factory]
    main = myproject:main
    [console_scripts]
    show_settings = myproject.scripts:settings_show
    """,
)

一旦你这样做了,调用 $VENV/bin/pip install -e . 将安装名为的文件 show_settings 进入 $somevenv/bin 目录中有一小段指向入口点的python代码。它将是可执行的。不带任何参数运行它将打印一个错误并退出。使用配置文件路径的单个参数运行它将打印设置。用一个 --omit=foo 参数将省略以键开头的设置 foo . 使用两个“省略”选项运行它(例如, --omit=foo --omit=bar )将忽略所有具有以任一项开头的键的设置 foobar

$VENV/bin/show_settings development.ini --omit=pyramid --omit=debugtoolbar
debug_routematch                             False
debug_templates                              True
reload_templates                             True
mako.directories                             []
debug_notfound                               False
default_locale_name                          en
reload_resources                             False
debug_authorization                          False
reload_assets                                False
prevent_http_cache                           False

皮拉米德 pservepshellprequestptweensp* 脚本作为控制台脚本实现。当您调用其中一个脚本时,您使用的是控制台脚本。