Compnet

仕事とか遊びとか、日々折々

2019-06-09(日)

Pyramid のお勉強 [序: Cookiecutters で手軽にプロジェクトを立ち上げよう]

Posted by Nakane, R. in Tecnical   

前の記事で Pyramid の Quick Tutorial を自習するための Pytheon の仮想環境を用意しました。 まとまった時間が中々取れないので途中何日も空くことになるかもしれませんが、少しずつでもチュートリアルを進めていこうと思っています。

最初は Prelude のセクション「Quick Project Startup with Cookiecutters」です。

目標

このセクションの目標に挙げられているのは以下の二つです。

  • cookiecutter を使って新しいプロジェクトを作る。
  • Pyramid アプリケーションを起動して、Web ブラウザでそれを確認する。

python には cookiecutter というパッケージがあります。 cookiecutter は用意されている雛型を取得して、それを自分の作業用の環境に展開してインストールする機能を提供するパッケージです。 雛型を展開する際に、その雛型が用意しているいくつかの質問に答えることで、初期値を設定した調整済みの雛型がインストールできます。 Pyramid でも cookiecutter で入手・展開できる雛型が提供されています。 このセクションは、cookiecutter で Pyramid の雛型のひとつをインストールして手っ取り早く pyramid で動かしてみることが主題です。

手順

  1. このセクションを始める前に環境変数 VENV を登録します。 Windows の環境変数は登録したコマンド プロンプトでしか使えまないため、前の記事の手順で登録した環境変数はコマンド プロンプトを閉じると無くなってしまいます。 今回の Prelude セクションで使うコマンド プロンプトを改めて開いたときは前の記事と同様に以下のコマンドで再度 環境変数を登録しなおします。

    set VENV=%USERPROFILE%\Documents\Python_Piramid\quick_tutorial\env
    

    コマンド プロンプトを閉じても環境変数が消えないようにする方法もありますが、チュートリアルを行うだけのための環境変数をそのようにする気にはなれず、筆者は毎回環境変数を登録しなおすようにしました。 Pyramid の Quick Tutorial ではセクションを進めても環境変数が消えない前提で書かれていますが、本ブログの一連の記事では各セクションの冒頭で環境変数を登録しなおします。

    また、ここで環境変数をもうひとつ登録します。 以下のコマンドで環境変数 CUR に、本チュートリアルのふたつめの手順で雛型をインストールするディレクトリを登録しておきます。

    set CUR=%USERPROFILE%\Documents\Python_Piramid\quick_tutorial
    
  2. 環境変数 VENV を登録し直したらこのセクションの最初の手順を実行します。 最初の手順は、仮想環境内の pip を使った cookiecutter パッケージのインストールです。

    "%VENV%\Scripts\pip" install cookiecutter
    
  3. 次の手順ではインストールした cookiecutter を使って pyramid の雛型をインストールしておきます。 インストールする雛型は Github で公開されている pylons/piramid-cookiecutter-startar です。 雛型の最新板、つまり Github での公開なので最新の master ブランチを使うのが一般的かもしれませんが、ここではチュートリアルで指示されているとおりに 1.10-branch をインストールします。 なお、本記事執筆時点ですでに master ブランチは 1.10-branch よりも先に進んでいるようです。

    本チュートリアルでは、雛型をカレント ディレクトリにインストールしていますが、ここでは以下のようにして先ほど登録した環境変数 CUR のフォルダーにインストールします。

    "%VENV%\Scripts\cookiecutter" gh:Pylons/pyramid-cookiecutter-starter --checkout 1.10-branch --output-dir "%CUR%"
    

    雛型のインストールが始まると雛型を調整するための質問が表示されます。

    project_name [Pyramid Scaffold]: cc_starter
    repo_name [cc_starter]: cc_starter
    Select template_language:
    1 - jinja2
    2 - chameleon
    3 - mako
    Choose from 1, 2, 3 (1, 2, 3) [1]:
    Select backend:
    1 - none
    2 - sqlalchemy
    3 - zodb
    Choose from 1, 2, 3 (1, 2, 3) [1]:
    

    もしも、cookiecutter を使った pylons/piramid-cookiecutter-startar のインストールを途中で中断してやり直したとか、再度実行したとかのときは、上の質問の前に You've downloaded ... \.cookiecutters\pyramid-cookiecutter-starter before. Is it okay to delete and re-download it? [yes]: と表示されます。これは以前にインストールした際にダウンロードした雛型の元を削除して、ダウンロードし直すかどうかという質問です。 今回のように Github のブランチを特定している場合はダウンロードし直す必要もないのですが、大抵の雛型はそんな大きくもないので、yes と答えてダウンロードし直すのが無難です。

    次の質問の project_name は展開する雛型を使うプロジェクトの名前で、その次の質問 repo_name はリポジトリの名前です。 リポジトリの名前は雛型をインストールするディレクトリ名としても使われます。 repo_name は、後でこれを pip でインストールするときのパッケージ名としても使われます。 これに対して project_name の方は、これを pip でインストールするときのパッケージの説明文にしか使われていないみたいです。 このセクションではどちらも cc_starter と入力します。

    次の Select template_language とその次の Select backend の質問は、テンプレート システムとバックエンド データベースにそれぞれ何を使うかです。 このセクションではどちら質問も初期値のままにしておくので、単に Enter を押して進めます。

  4. 次のステップでは、雛型をインストールしたフィルダーに python の仮想環境を作り、その仮想環境にインストールした雛型を python のパッケージとして pip を使ってインストールします。

    このステップで作る仮想環境は、前の記事で準備した仮想環境とは別の環境になります。 別の環境にする理由は、この後のチュートリアルのステップに影響を及ぼさないようにするためではないかと、筆者は推測します。

    チュートリアルの本セクションで使う新たな Python の仮想環境を作るために以下のコマンドを実行します。

    py -3.7 -m venv "%CUR%\cc_starter\env"
    

    チュートリアルの Prelude には cd cc_starter を実行してから python3 -m venv env を実行するように書いてあります。 同じように cd cc_starter を実行してから py -3.7 -m venv env とすることもできますが、できるだけカレント ディレクトリに依存ないようにしてコマンドを使いたいので上のようにしています。

    Prelude で使う仮想環境を作ったら、その仮想環境に雛型から作ったパッケージを pip でインストールします。 おっと、その前に pip と setuputools を最新バージョンに更新することを忘れてはいけません。

    "%CUR%\cc_starter\env\Scripts\pip" install --upgrade pip setuptools
    

    pip と setuputools を最新バージョンに更新したら、雛型から作ったパッケージをインストールします。

    pip によるインストールでは、対象のパッケージは Python のパッケージ ディレクトリにコピーされます。 当然のことですが pip でインストールしたパッケージを直接修正することは考えられていません。 インストールしたパッケージの修正は、修正されたパッケージを pip で更新 (実態は上書きインストール) するしかありません。

    しかし今回のように動作を確認しながら修正していく必要があるときには、このような動作は好ましくありません。 こういったときのために pip には "Editable" Install という動作が定義されています。 "Editable" Install ではパッケージを Python のパッケージ ディレクトリにコピーせずに、元のディレクトリ・ファイルをそのままで登録だけを行います。 "Editable" Install されたパッケージのファイルへの変更は「更新」しなくても即時に反映されるので、動かしては直しを繰り返す開発途中の検証に便利です。

    pip で "Editable" Install するには --editable オプションを付けるか、以下のように -e オプションをつけて pip install コマンドを実行します。

    "%CUR%\cc_starter\env\Scripts\pip" install -e "%CUR%\cc_starter"
    

    cookiecutter で取得した雛型から作ったパッケージを pip でインストールすると、雛型に含まれる setup.py で指定されてる pyramid 他のパッケージも一緒にインストールされます。 このことから、前の記事で準備した仮想環境とは別の仮想環境を用意した理由が、雛型で使ういろいろなパッケージがインストールされてしまうことにあったのだとここで分かりました。

  5. このステップでは cookiecutter で取得した雛型から作ったパッケージに含まれる development.ini を引数にして、以下のように pserve コマンドを実行します。

    "%CUR%\cc_starter\env\Scripts\pserve" "%CUR%\cc_starter\development.ini" --reload
    

    コマンドを実行すると以下のメッセージが表示されます。 最初の 2 行に表示される PID の数値はコマンド実行のたびに変わります。 続く 2 行に表示される URL はチュートリアルでは http://*localhost*:6543 と書かれていますが、筆者のように Windows で実行したときはコンピューター名になるようです。

    Starting monitor for PID 17952.
    Starting server in PID 16324.
    Serving on \http://mypc:6543
    Serving on \http://mypc:6543
    

    pserve は WSGI に対応した Web サーバーを起動するコマンドで、Pyramid と同じプロジェクトで提供されている、waitress パッケージに含まれています。 waitress のパッケージは先ほどの pip" install -e "%CUR%\cc_starter" の実行時に雛型から作ったパッケージに紐付いてインストールされます。 Pyramid で作るアプリケーションは、多分 WSGI に対応するどの Web サーバーでも動きます。 Pyramid の Quick Tutorial では前の記事に書いたように Requirements のセクションで waitress パッケージを明示的にインストールしています。 このため、この後のチュートリアルでも waitress、つまり pserve コマンドで WSGI 対応 Web サーバーを起動すると思われます。

  6. 最後のステップです。

    ここでは先の 4 の手順で動かした Web サーバーにブラウザからアクセスします。 アクセスする URL は http://localhost:6453 です。 pserve の実行で表示される http://mypc:6543 だとエラーになるはずです。 これは Windows の初期設定の都合で localhost と表示されるはずのところがコンピューター名になってしまっているからです。 この後のチュートリアルで pserve コマンドを実行するときも、コンピューター名が表示されたらこれを localhost に読み替えます。

    Web ブラウザーで http://localhost:6453 にアクセスすると以下が表示されます。

    ところで、pserve を実行したのとは別のコマンド プロンプトを開いて以下のコマンドを実行して、ポート番号が 6453 の TCP ソケットの状態を確認してみます。

    netstat -ano | find /i ":6543"
    
    TCP         127.0.0.1:6543         0.0.0.0:0              LISTENING       24412
    TCP         [::1]:6543             [::]:0                 LISTENING       24412
    

    上のように待ち受けの IP アドレスが 127.0.0.1 と ::1 になっています。 このことから pserve による Web サーバーは、これを起動した PC で動かした Web ブラウザからしかアクセスできないことがわかります。 チュートリアルなので別の PC からアクセスできる必要もありませんし、実際に Pyramid で何かを作って運用するときは Apache や Nginx などの安定した Web サーバーを使うはずなので、これで構わないのでしょう。

    ところで、先ほどの pserve を実行したコマンド プロンプトで ctrl-C を入力して、Web サーバーを停止してから改めて Web ブラウザーで http://localhost:6453 にアクセスすると、当然のことですがサーバーに接続できないといったエラーになります。

分析

このチュートリアルでは cookiecutter を使って、広く公開されている幾多の雛型からひとつを選んで Pyamid アプリケーションを含む Python のプロジェクトが簡単に作成できるということで、実際に pylons/piramid-cookiecutter-startar の雛型を例に検証しました。

また、このセクションには pserve についても書かれていて、上記の 4 のステップの development.ini のような設定ファイルで Pyramid アプリケーションをどのように起動するかを指定しています。

Comments