カテゴリー
Python

XREA で Python 3 を使う

Python 3.4 をビルドしてインストールする

ssh で接続して次のように作業します。

[code language=”shell”]
cd $HOME
wget https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tgz –no-check-certificate -O -| tar xz
pushd Python-3.4.2/
./configure –prefix $HOME && make && make test && make install
popd
$HOME/bin/python3 -c "print(‘hello, python’)"
[/code]

この状態だと次のように警告が出て使用できないモジュールが報告されますが、無視しても問題ないでしょう。

The necessary bits to build these optional modules were not found:

_lzma _tkinter readline

ここまで来ると普通に pip や venv が使えますので適当にセットアップします。

Apache で動くように設定する。

XREA ではリバースプロキシ用にサーバーを立てたりできませんし、mod_wsgi も使用できません。スクリプトは CGI 経由で使用するしかありません。

/virtual/YOU/public_html 以下の適当なディレクトリに次のような .htaccess ファイルを作成します。

この例では RewriteRule で Authorization ヘッダーを Apache が処理しないようにしています。

このディレクトリにリクエストを発行すると index.py が呼び出されます。クライアント側の URL のパスの最後のスラッシュ (‘/’) は必須なので注意してください。

[code language=”text”]
AddHandler cgi-script .py
# AddHandler cgi-script-debug .py

DirectoryIndex index.py

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
RewriteRule ^.*$ index.py

[/code]

CGI から WSGI application を呼ぶ

今どきわざわざ Python 3.4 を使って CGI もないので簡単なラッパーを作成しました。

もし使用するときは shebang のパスを書き換えてください。

[code language=”python”]
#!/virtual/YOU/bin/python3
# –– coding: utf-8 –
import sys
import os
import io
import collections
import wsgiref.util

def wrap_wsgi(app, *, environ: dict=os.environ, output: io.BufferedIOBase=sys.stdout.buffer,
              encoding='utf-8'):
    """Run WSGI application in CGI environment.
    """
    assert callable(app)
    assert isinstance(environ, collections.Mapping)
    assert isinstance(output, io.BufferedWriter)

    environ = environ.copy()
    environ.setdefault('PATH_INFO','/')
    if 'REMOTE_ADDR' in environ:
        environ.setdefault('REMOTE_HOST', environ['REMOTE_ADDR'])
    environ.setdefault('wsgi.input', sys.stdin.buffer)
    environ.setdefault('wsgi.errors', sys.stderr)
    wsgiref.util.setup_testing_defaults(environ)

    response_started = False
    write = output.write

    def start_response(status: str, headers: [(str, str)]):
        nonlocal response_started

        assert not response_started
        response_started = True

        assert isinstance(status, str)
        write(b'Status: ' + status.encode(encoding) + b'rn')

        for k, v in headers:
            assert isinstance(k, str)
            assert isinstance(v, str)
            write(k.encode(encoding) + b': ' + v.encode(encoding) + b'rn')

        write(b'rn')

    for chunk in app(environ, start_response):
        assert response_started
        assert isinstance(chunk, bytes)
        write(chunk)


if __name__ == '__main__':
    from wsgiref.simple_server import demo_app
    wrap_wsgi(demo_app)

[/code]

psycopg2 をインストールする

使用している XREA にインストールされている PostgreSQL 7.4.14 では psycopg2-2.5.4 がビルドできません。PostgreSQL 9 をインストールしてビルドします。

接続テストには http://www.sXXX.xrea.com/jp/admin.cgi のデータベースで設定した情報を使用します。文字コードは UNICODE にした方が良いでしょう。

[code language=”shell”]
wget https://ftp.postgresql.org/pub/source/v9.3.5/postgresql-9.3.5.tar.gz –no-check-certificate -O – | tar xz
pushd postgresql-9.3.5/
./configure –prefix $HOME –without-readline && make && make install
popd

wget http://initd.org/psycopg/tarballs/psycopg2-latest.tar.gz -O - | tar xz
pushd psycopg2-2.5.4/
LD_LIBRARY_PATH=$HOME/lib $HOME/bin/python3 setup.py build_ext --pg-config $HOME/bin/pg_config --static-libpq build install
popd

$HOME/bin/python3 -c "import psycopg2; psycopg2.connect('dbname=? user=? password=?')"

[/code]

「XREA で Python 3 を使う」への4件の返信

はじめまして。
自作WebツールをXREAに載せようとして、普通にWSGIアプリケーションが使えない・・・と知り、こちらに辿り着きました。
「CGI から WSGI application を呼ぶ」のラッパーは、どういうふうにして使うものでしょうか。
CGIの呼び出しを、WSGIアプリケーションの呼び出しに置き換えるものだというイメージはしているのですが・・・
よかったら教えてください。

wrap_wsgi() を index.py に書いて __main__ で demo_app の代わりに自分の WSGI アプリケーションオブジェクトを引数に呼び出します。
apache -> CGI -> Python -> index.py -> WSGI アプリケーション という流れです。
.htaccess も忘れずに設定して下さい。

はっきり言ってかなり遅いはずなので気を付けてください。

ありがとうございます。
当方Python2環境なので、コードを書き換えて試して見ます。
レスポンスはやっぱり難ありそうですね。ひとまず個人レベルの利用なので問題ないです。

連投ですいません。
ラッパーをindex.pyとして、アプリケーションがあるフォルダに置いて使う感じでしょうか。
試してみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です