(機械翻訳) コマンドラインピラミッド¶
Your:app: `Pyramid`アプリケーションは、さまざまなコマンドラインユーティリティを使用して制御および検査できます。これらのユーティリティは、この章で説明されています。
指定されたURLの一致するビューの表示¶
いくつかのビューを持つ大きなアプリケーションでは、すべてのビューを自分で定義したとしても、ビューの設定の詳細を頭に入れておくことは難しいでしょう。ターミナルウィンドウで `` pviews``コマンドを使うと、アプリケーション内の指定されたURLに対応するルートとビューの要約を表示できます。 `` pviews``コマンドは2つの引数を受け取ります。 `` pviews``の最初の引数はアプリケーションの `` .ini``ファイルへのパスで、 .ini`ファイル内のセクション名はアプリケーションを指しています。これは、 ` config_file#section_name``の形式でなければなりません。 2番目の引数は、一致するビューをテストするURLです。 `` section_name``は省略することができます。そうであれば、それは「主」とみなされます。
以下は、単純なビュー設定の例です:term: 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がそのビュー構成の詳細と一致するすべてのビューの上部と下部に表示されます。この例では1つのビューのみが一致しているので、* View *セクションは1つだけです。一致するビューごとに、呼び出し可能な関連ビューへの完全なコードパスが、そのビュー設定の一部であるすべての権限と述部とともに表示されます。
より複雑な設定では、次のようなものが生成される可能性があります。
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)
|
この例では、:term: `URL dispatch`アプリケーションを扱っています。この特定のURLには、2つの一致するルートがあります。一致するルート情報が最初に表示され、その後にそのルートに関連付けられたビューが表示されます。第2の一致するルート出力からわかるように、ルートは複数のビューに関連付けることができます。
ビューと一致しないURLの場合、 `` pviews``は単に* Not found *メッセージを出力します。
インタラクティブシェル¶
`` pip install -e .``を使って開発用にプログラムをインストールしたら、インタラクティブなPythonシェルを使ってPython環境で式を実行することができます"これを行うには、 `` pshell``コマンドラインユーティリティを使用します。
`` pshell`の引数は `` config_file#section_name``の形式に従います。 `` config_file``はアプリケーションの `` .ini``ファイルへのパスで、 `` section_name``は `` app``です。あなたのアプリケーションを指し示す `` .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
|
そのような場合は、次のコマンドを使用してセクション名として `` 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``グローバルとしてシェル内で利用可能になります。また、読み込まれたアプリケーションが:surrounding:term: middleware`を持たない:app: Pyramid`アプリケーションであれば、デフォルト:term: ルートファクトリ、 `` registry``によって返される ``ルート ``オブジェクト`と` `要求 ''が利用可能になります。
ファイル名の後にハッシュを省略することで、 `` main``のデフォルトのセクション名に頼ることもできます:
$ $VENV/bin/pshell starter/development.ini
対話シェルを終了するには `` Ctrl-D``を押します(Windowsでは `` Ctrl-Z``)。
シェルの拡張¶
`` pshell``を起動したときに、対話型シェルを使って、アプリケーションにとって重要な変数を既にグローバルとしてロードしている場合に便利です。これを容易にするために、 `` pshell``はINIファイル内の特別な `` [pshell] ``セクションを探し、後続のキーと値のペアをシェルに公開します。各キーは、pshellセッション内でグローバルになる変数名です。各値は:term: 点線のPython名`です。指定した場合、特殊キー ` setup``は:term: ドット付きPython名`でなければなりません。シェルにロードされるグローバルの辞書を受け付ける呼び出し可能ファイルを指します。これにより、 ` pshell``が実行されるたびにカスタム初期化コードが実行されるようになります。 INIファイルのキーを上書きする `` --setup``オプションを使用して、コマンドラインから `` setup``呼び出し可能ファイルを指定することもできます。
たとえば、実際のデータベースでモデルを変更できるように、モデルをシェルに公開してデータベースセッションとしたいとします。ここでは、モデルが `` myapp.models``パッケージに格納されていると仮定します。
1 2 3 4 5 | [pshell]
setup = myapp.lib.pshell.setup
m = myapp.models
session = myapp.models.DBSession
t = transaction
|
`` setup``を呼び出し可能にすることで、シェルに公開される前に地球環境を受け取る `` setup``という名前の呼び出し可能モジュールを含む `` myapp.lib.pshell``モジュールを作成します。ここでは、環境の要求を変更し、要求を簡単に提出できるWebTestバージョンのアプリケーションを含む新しい値を追加します。
1 2 3 4 5 6 7 | # myapp/lib/pshell.py
from webtest import TestApp
def setup(env):
env['request'].host = 'www.example.com'
env['request'].scheme = 'https'
env['testapp'] = TestApp(env['app'])
|
このINIファイルがロードされると、余分な変数 `` m``、 `` session``、 `` t``がすぐに利用できるようになります。 `` setup``呼び出し可能関数も指定されているので、それが実行され、新しい変数 `` testapp``が公開され、リクエストはホスト `` http:// www.example.com``からURLを生成するように設定されます`。例えば:
$ $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:
m myapp.models
session myapp.models.DBSession
t transaction
>>> testapp.get('/')
<200 OK text/html body='<!DOCTYPE...l>\n'/3337>
>>> request.route_url('home')
'https://www.example.com/'
代替シェル¶
`` 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
箱の中でサポートされていないシェルを使いたい場合は、 `` setup.py``にエントリポイントを登録することで新しいシェルを導入できます:
setup(
entry_points={
'pyramid.pshell_runner': [
'myshell=my_app:ptpython_shell_factory',
],
},
)
そして、あなたのシェルファクトリは `` env``と `` help``という2つの引数を受け付ける関数を返すべきです。
from ptpython.repl import embed
def ptpython_shell_runner(env, help):
print(help)
return embed(locals=env)
バージョン 1.6 で変更: エントリポイントを使用してユーザ定義のシェルを登録することができます。それ以前はサポートされていたシェルは `` ipython``、 `` bpython``、 `` python``でした。
`` ipython``と `` bpython``はそれぞれのパッケージ `` pyramid_ipython``と `` pyramid_bpython``に移されました。
デフォルトシェルの設定¶
あなたの `` [pshell] `` iniセクションで `` default_shell``オプションを使って好みのシェルのリストを指定することができます。
1 2 | [pshell]
default_shell = ptpython ipython bpython
|
バージョン 1.6 で追加.
すべてのアプリケーションルートの表示¶
ターミナルウィンドウで `` proutes``コマンドを使うと、アプリケーションに関連するルートの要約を表示できます。 `` pshell`コマンド(ref: interactive_shell`参照)と同様に、 proutes``コマンドは、 config_file#section_name``という形式の引数を受け取ります。 ` config_file``はあなたのアプリケーションの `` .ini``ファイルへのパスです。 `` section_name``はあなたのアプリケーションを指し示す `` .ini``ファイル内の `` app``セクション名です。デフォルトでは、 `` section_name``は `` main``であり省略することができます。
例えば:
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 、 Pattern 、 View 、 Method *の4つのカラムを持つテーブルを生成します。 「名前」列にリストされている項目はルート名、「パターン」列にリストされている項目はルート・パターン、「ビュー」列にリストされている項目は、要求が関連するルート・パターンと一致したときに呼び出される、 [メソッド]列にリストされている項目は、ルート名に関連付けられているリクエストメソッドです。 [表示]列には、 <unknown>関連するビュー呼び出し可能なものが見つからない場合は ``ルート名のMethodカラムには、 `` <route mismatch> ``呼び出し可能なビューがルートのリクエストメソッドのどれも受け入れない場合は `` ``、呼び出し可能なビューがルートのリクエストメソッドのいずれかを受け入れる場合は `` * ``アプリケーション内でルートが設定されていない場合、 `` proutes``が実行されるとコンソールに何も出力されません。
`` proutes``コマンドを頻繁に使用して、表示する列や順序を設定すると便利です。これを容易にするため、 `` proutes``はあなたの `` .ini``ファイル中の特別な `` [proutes] ``セクションを探し、デフォルトとして使用します。
たとえば、リクエストメソッドを削除して、ビューを最初に配置することができます。
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``という引数があります。これは、カンマ区切りの列のリストです。現在利用可能なフォーマットは ``名前 ``、 ``パターン ``、 ``ビュー ``、 ``メソッド ``です。
"Tweens ¶
A:term: tween`はPyramidの主なアプリケーションリクエストハンドラとそれを呼び出すWSGIアプリケーションの間にあるコードです。暗黙的なトゥイーンの順序(:meth: `pyramid.config.Configurator.add_tween`の呼び出しで指定された順序)と明示的なトゥイーンの順序( pyramid.tweens``設定の設定で指定された順序) ` ptweens``コマンドを使用します。 Tweenファクトリは、 `` ptweens``の出力に標準的なPythonの点線の名前で表されます。
たとえば、明示的なtweensなしで設定されたシステムに対して `` ptweens``コマンドを実行すると、次のようになります。
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
|
`` development.ini``ファイルで*明示的に定義されたtweensで設定されたシステムに対して実行される `` ptweens``コマンドは次のとおりです:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ 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
|
上記の `` ptweens``コマンドで使用される `` development.ini``のアプリケーション設定セクションは、明示的なトゥイーンチェーンが使用されていることを報告します:
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
|
トゥイーンの詳細については、ref: `registration_tweens`を参照してください。
リクエストの呼び出し¶
`` prequest``コマンドラインユーティリティを使ってアプリケーションにリクエストを送信し、サーバを起動せずにレスポンスボディを見ることができます。
`` prequest``には二つの必須引数があります:
- 設定ファイル/セクションは `` config_file#section_name``フォーマットに従います。 `` config_file``はアプリケーションの `` .ini``ファイルへのパスで、 `` section_name``は `` app``セクションです`` .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に相当するものに変換することでWSGI環境に追加されます(例えば `` Host = example.com``は `` example.com``の値として `` HTTP_HOST``ヘッダ変数を挿入します)。複数の --header``オプションを指定できます。特別なヘッダ値 ` content-type``は、WSGI環境で `` CONTENT_TYPE``を設定します。
デフォルトでは、 `` prequest``は `` GET``要求を送信します。これを変更するには、 `` -m``(別名 `` --method``)オプションを使用します。現在、 `` GET``、 `` HEAD``、 `` POST``、 `` DELETE``がサポートされています。 `` POST``を使うと `` prequest``プロセスの標準入力が `` POST``本体として使われます:
$ $VENV/bin/prequest -mPOST development.ini / < somefile
`` p * ``スクリプトを実行するときのPythonへのカスタム引数の使用¶
バージョン 1.5 で追加.
Pyramidのコンソールスクリプト( `` pserve``、 `` pviews``など)は、 `` python3 -m``を使って直接実行でき、実行時にカスタム引数をPythonインタプリタに送ることができます。例えば::
python3 -m pyramid.scripts.pserve development.ini
インストールされているすべてのディストリビューションとそのバージョンの表示¶
バージョン 1.5 で追加.
`` pdistreport``コマンドを使って:app: `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のパッケージ化と配布に精通した人が必要です。
スクリプトを書く¶
すべてのWebアプリケーションは、要求を受け入れて応答を返すシステムです。 :app: Pyramid`アプリケーションによって要求が受け入れられると、システムは要求から状態を受け取ります。要求は、後でアプリケーションコードに依存します。たとえば、term: `view callable`は、特定のコンポジションの `request.matchdict``を持つリクエストに対して動作していると仮定していますが、別のものはmatchdictの異なる構成を想定しています。
それと同時に、:app: `Pyramid`アプリケーションで使用されるデータベーステーブルを更新するなど、Pyramid環境で動作するPythonスクリプトを書くことが便利です。しかし、"実"ピラミッド環境は、要求に依存しない完全に静的な状態を持っていません。あなたのアプリケーション(とPyramid自体)は、ほとんどの場合、要求から情報を得ることに頼っています。アプリケーションからコードを単純にインポートして実行しようとするPythonスクリプトを実行すると、実際のWeb要求がないため、要求データはありません。したがって、アプリケーションのいくつかの部分といくつかのPyramid APIは動作しません。
このため、:app: Pyramid`は、特定の:term: request`があなたの:app: `Pyramid`アプリケーションに到達したときに生成される環境のような環境でスクリプトを実行することを可能にします。これは、スクリプト本体に:func: `pyramid.paster.bootstrap`コマンドを使用することで実現します。
バージョン 1.1 で追加: :func: pyramid.paster.bootstrap
バージョン 1.8 で変更: `` boot```を `` with``文で自動的にクリーンアップする機能を追加しました。
最も単純なケースでは、:func: pyramid.paster.bootstrap`はPyramidアプリケーションの設定を単一の引数として表す:term: PasteDeploy` `` .ini``ファイルを受け入れる単一の引数で使用できます:
from pyramid.paster import bootstrap
with bootstrap('/path/to/my/development.ini') as env:
print(env['request'].route_url('home'))
:func: pyramid.paster.bootstrap`は、フレームワーク関連の情報を含む辞書を返します。この辞書は常に:term: `request`オブジェクトを `request``キーとして含んでいます。
func: pyramid.paster.bootstrap:以下のキーは、` `env``ディクショナリで利用可能です。
要求
A:class: `pyramid.request.Request`オブジェクトはあなたのスクリプトの現在の要求状態を意味します。
アプリ
ブートストラップによって生成される:term: `WSGI`アプリケーションオブジェクト。
ルート
あなたの:app: Pyramid`アプリケーションの:term: resource`ルートです。これは、アプリケーションで設定された:term: `ルートファクトリ 'によって生成されるオブジェクトです。
レジストリ
クローザー
スクリプティングジョブが終了したときにinternal:app: Pyramid`スレッドローカルスタックをポップするために使用できるパラメータなしの呼び出し可能ファイル(:func: pyramid.threadlocal.get_current_registry`と:func: 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``を指定することと同じです。この場合、ペースト"translogger ":term: middleware`(リクエストをコンソールに記録する)にラップされた `app``オブジェクトを含む設定を使用します。
`` main``の代わりに読み込むPasteDeploy `` .ini``ファイルの特定の*セクション*を指定することもできます:
from pyramid.paster import bootstrap
with bootstrap('/path/to/my/development.ini#another') as env:
print(env['request'].route_url('home'))
上記の例では、PasteDeploy設定ファイルの `` app``、 `` pipeline``、または `` composite``セクションを指定しています。 :func: pyramid.paster.bootstrap`によって返される env``辞書にある app``オブジェクトは、:app: Pyramid`:term: `router`になります。
リクエストの変更¶
デフォルトでは、Pyramidは `` env``ディクショナリに `` http:// localhost:80 / ``というURLのリクエストオブジェクトを生成します。つまり、スクリプトの実行中にPyramidによって生成されたURLは、ここに固定されます。これは一般的にあなたが望むものではありません。
それでは、ピラミッドに正しいURLを生成させるにはどうしたらいいですか?
あなたのアプリケーションで以下のようにルートを設定したと仮定します:
config.add_route('verify', '/verify/{code}')
WSGIアプリケーションが特定のベースからの要求を処理していることをPyramid環境に通知する必要があります。たとえば、アプリケーションを `https:// example.com / prefix`にマウントすることをシミュレートして、生成されたURLがGoogleのデプロイメントに適していることを確認します。これは、結果の要求オブジェクトを変更するか、または単に目的のリクエストを作成して、それをfunc: `〜pyramid.paster.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'
これで、PyramidのAPIを使用してURLを生成できます。
env['request'].route_url('verify', code='1337')
# will return 'https://example.com/prefix/verify/1337'
掃除¶
`` with``ステートメントバリアントを使用している場合、心配することはありません。しかし、スクリプトロジックが終了したときに返された環境を直接使用している場合は、 `` close``コールバックを呼び出すのがよいでしょう。
from pyramid.paster import bootstrap
env = bootstrap('/path/to/my/development.ini')
# .. do stuff ...
env['closer']()
スクリプトをコンソールスクリプトにする¶
"コンソールスクリプト"は次のようになります:term: `` setuptools`:Pythonの `` bin``ディレクトリにインストールされるスクリプトの用語です:term: virtual environment`(または" base "Python環境) a:そのスクリプトを格納しているterm: `distribution`がインストールされています。ディストリビューションのインストール時に仮想環境の ` bin``ディレクトリにインストールされるので、コマンドラインから呼び出せる機能をパッケージ化して配布するのに便利です。 `` .py``スクリプトを作成し、人々に"右" Pythonインタプリタで呼び出すように指示するよりもコンソールスクリプトを作成するほうが便利です。コンソールスクリプトは `` bin``に存在するファイルを生成し、それが呼び出されると常に"右" Python環境を使用します。つまり、必要なすべてのライブラリが必要な環境で常に呼び出されますピラミッドのように)利用可能です。
一般に、次のようにしてスクリプトをコンソールスクリプトにすることができます。
- 既存のディストリビューション(例えば、 `` cookiecutter``で既に作成したディストリビューション)を使用するか、少なくとも1つのパッケージやモジュールを持つ新しいディストリビューションを作成してください。ディストリビューション内のどのモジュールでも、引数をとらず、実行するコードを実行する呼び出し可能な関数(通常は関数)を格納する必要があります。
- スクリプト名と配布ファイルに追加した呼び出し可能ファイルを表すドット付きの名前の間のマッピングを作成する配布の `` entry_points``引数に `` [console_scripts] ``セクションを追加してください。
- あなたのディストリビューションを再インストールするには、 `` pip install -e .``または `` pip install .``を実行してください。ディストリビューションを再インストールすると、最後のステップで指定したスクリプトを表すファイルは、ディストリビューションをインストールした仮想環境の `` bin``ディレクトリにあります。実行可能になります。ターミナルから呼び出すと、あなたの呼び出し可能コードが実行されます。
例として、Pyramidアプリケーションのデプロイメント設定を出力するコンソールスクリプトによって呼び出されるコードをいくつか作成しましょう。これを行うために、 `` 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``モジュールを使って、スクリプトに渡された余分な引数を理解できるようにします。 :func: `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 >= 1.3.1', # py3 compat
'pytest', # includes virtualenv
'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``ファイルを変更して、 `` entry_points``文字列に `` [console_scripts] ``セクションを追加します。このセクションでは、 `` scriptname = dotted.path.to:yourfunction``行を指定する必要があります。例えば:
[console_scripts]
show_settings = myproject.scripts:settings_show
`` show_settings``の名前は、 `` bin``にインストールされているスクリプトの名前になります。上記の `` 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 >= 1.3.1', # py3 compat
'pytest', # includes virtualenv
'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 .``を実行すると `` $ somevenv / bin``ディレクトリに `` show_settings``という名前のファイルが小さなPythonコードでインストールされますあなたのエントリーポイントを指しています。実行可能になります。引数なしで実行すると、エラーが出力され、終了します。設定ファイルのパスである1つの引数を指定して実行すると、設定が出力されます。 `` --omit = foo``引数でそれを実行すると、 `` foo``で始まるキーを持つ設定は省略されます。 2つの "省略"オプション(例えば、 `` --omit = foo --omit = bar``)で実行すると、 `` foo``や `` bar``で始まるキーを持つ設定はすべて省略されます。 :
$ $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
Pythonの `` pserve``、 `` pcreate``、 `` pshell``、 `` prequest``、 `` ptweens``などの `` p * ``スクリプトはコンソールスクリプトとして実装されています。そのうちの1つを起動すると、コンソールスクリプトを使用しています。