PostgreSQL 9.5 RC1の起動バッチファイルに設定追加(以下、明日) PL/Pythonのテスト(無名コードブロックでウェブアクセス)

実行環境

過去記事と関連リンク

先頭に挙げた5月19日の記事以来、久々のPythonです。その時はWindows 7 32bit + PostgreSQL 9.4 + WinPythonでした。今回はOSが64bitに、ポスグレが9.5 RC1に、またWinPythonでなく独自にPython 3.3の必要最小限なポータブル環境を用意しました。上記リンクにMSIファイル操作があるのは、その関連です。リンクの最後urllibは、単にテストに使ったから。

PL/Pythonに使うPythonのバージョンを確認

最近のWindows版のPostgreSQLは、インストーラ、zipともにPL/Python用のライブラリが同梱されており、9.5 RC1も同様。↓ libフォルダにあるplpython3.dllがそれです。 ただし5月19日の記事に書いたとおり、このライブラリが前提するのと同じバージョンのPythonを準備しないと使えません。ライブラリのファイル名からPython 3系のようですが、その下の3.xも合わせないと。で自分はいつも、Dependency Walkerにplpython3.dllを入れて「見つからない」と言われたファイル名から3.xを予想します。 ↓ 今回の結果。5月19日の時と同様にpython33.dllに依存してるぽいので、Python 3.3と推測して進めます。

最小限でポータブルなWindows版Python 3.3を準備

5月の時に使ったWinPythonは様々なパッケージが付いている反面、サイズが大きく(ダウンロードで200MB超、解凍すると1GB超)準備や移動がやや難で、手軽とは言えません。…という声が多かったのか、最近では軽量なSlim版やZero版も出てきました。しかしPython 3.3用はないため、今回、独自に最小限のポータブル環境を準備。まず本家サイトからWindows 64bit用のインストーラをダウンロードします。サイズはわずか584KB。 このまま実行するとポータブルでなくなるので、関連リンクに挙げた@ITの記事と同様にファイルだけ抽出します。具体的には、インストーラpython-3.3.5.amd64.msiを適当な場所に置いてコンソールを開き、下記コマンドを実行。結果やメッセージが出ないので分かりづらいですが、問題なければtargetdirにフォルダ・ファイルが出来ているはず。例えば下の画像のように。抽出後の全体のサイズは約55MBでした。
start /wait msiexec /a python-3.3.5.amd64.msi targetdir="R:\TMP\3.3.5" /qn
コマンド実行時にC:/Config.Msiというフォルダが作成されますが、実行後は空になるので削除しても問題ないと思います。続いてPythonを起動しようとしたら ↓ Visual C++ 2010ランタイムがない(msvcr100.dllが見つからない)エラーになったので、先日のmsvcr120.dllと同様にして適宜調達。例えば英語ですがこの掲示版とかを参考に。コピー先はpython.exeと同じトップへ。

Python単体のテスト

本来は、PostgreSQLと同様に起動用バッチファイルを作って環境変数を設定し、どこからでもPythonシェルを呼び出せるようにしたいところ。ただ今回はPL/Pythonが主目的なので省き、とりあえずpython.exeのある所をカレントにコンソールを開き、シェルを起動。↓ 続いて簡単なテスト。urllib.requestからurlopenをインポートしてウェブアクセスしてみました。アクセス先はこのブログのトップページで、一つのJavaScriptから全コンテンツを動的に生成してます。
>>> from urllib.request import urlopen
>>> urlopen('http://kenpg.bitbucket.org/').read()
b'<!DOCTYPE html><html>\r\n<head>\r\n<meta http-equiv="Content-Type" content=
"text/html; charset=UTF-8">\r\n<meta http-equiv="X-UA-Compatible" content="IE
=10"/>\r\n</head>\r\n<body><script src="kenpg_ver1_index.js" type="text/javas
cript"></script></body>\r\n</html>\r\n'
使うモジュールやパッケージによっては環境変数の追加が必要かもしれませんが、とりあえずPython 3.3本体が動いたので良しとし、明日はPL/Pythonの環境構築について書きます。