LoginSignup
0
0

More than 5 years have passed since last update.

PyGreSQLをソースコードからビルド

Last updated at Posted at 2018-03-31

PyGreSQLは、PythonからPostgreSQLにアクセスできる、BSDライクなライセンスのライブラリです。
公式マニュアルにある手順に従って、PyGreSQLをソースコードからビルドしてみました。

動作確認はmacOS 10.13.3、Python3.5.2、PostgreSQL 9.4.6で行いました。

ビルド要件

ビルドするには、以下がインストールされている必要があるとのことです。

  • Pythonヘッダーファイル
  • PostgreSQL クライアント・サーバーヘッダーファイル

通常、これらは"devel"パッケージに含まれているとのこと。

precompiled PostgreSQLを利用している場合は、 pg_configツールも必要で、これも通常、 "devel"パッケージに含まれるとのことです。

ビルドしてみる

PyGreSQLをダウンロード、解凍します。

$ wget http://pygresql.org/files/PyGreSQL.tar.gz
$ tar xvf PyGreSQL.tar.gz

DistUtilsを使ってビルドできるとのことなので、してみましょう。

ビルド前のディレクトリ構成はこんな感じ。

$ cd PyGreSQL-5.0.4
$ ls -l
total 672
-rw-r--r--@  1 hz  staff    1290  7 23  2017 LICENSE.txt
-rw-r--r--@  1 hz  staff     556  7 23  2017 MANIFEST.in
-rw-r--r--@  1 hz  staff    1362  7 23  2017 PKG-INFO
drwxr-xr-x@  7 hz  staff     224  7 23  2017 PyGreSQL.egg-info
-rw-r--r--@  1 hz  staff     859  7 23  2017 README.rst
drwxr-xr-x@ 15 hz  staff     480  7 23  2017 docs
-rw-r--r--@  1 hz  staff   96135  7 23  2017 pg.py
-rw-r--r--@  1 hz  staff   61267  7 23  2017 pgdb.py
-rw-r--r--@  1 hz  staff  145938  7 23  2017 pgmodule.c
-rw-r--r--@  1 hz  staff    3063  7 23  2017 pgtypes.h
-rw-r--r--@  1 hz  staff    3974  7 23  2017 py3c.h
-rw-r--r--@  1 hz  staff     165  7 23  2017 setup.cfg
-rwxr-xr-x@  1 hz  staff    8026  7 23  2017 setup.py
drwxr-xr-x@ 13 hz  staff     416  7 23  2017 tests

ビルドします。

$ python setup.py build
running build
running build_py
creating build
creating build/lib.macosx-10.6-x86_64-3.5
copying pg.py -> build/lib.macosx-10.6-x86_64-3.5
copying pgdb.py -> build/lib.macosx-10.6-x86_64-3.5
running build_ext
building '_pg' extension
creating build/temp.macosx-10.6-x86_64-3.5
/usr/bin/clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/hz/.pyenv/versions/anaconda3-4.2.0/include -arch x86_64 -DPYGRESQL_VERSION=5.0.4 -DDIRECT_ACCESS -DLARGE_OBJECTS -DDEFAULT_VARS -DESCAPING_FUNCS -I/Users/hz/.pyenv/versions/anaconda3-4.2.0/include/python3.5m -I/usr/local/pgsql/include -I/Users/hz/.pyenv/versions/anaconda3-4.2.0/include/python3.5m -c pgmodule.c -o build/temp.macosx-10.6-x86_64-3.5/pgmodule.o -O2 -funsigned-char -Wall -Werror
/usr/bin/clang -bundle -undefined dynamic_lookup -L/Users/hz/.pyenv/versions/anaconda3-4.2.0/lib -arch x86_64 build/temp.macosx-10.6-x86_64-3.5/pgmodule.o -L/Users/hz/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages -L/usr/local/pgsql/lib -L/Users/hz/.pyenv/versions/anaconda3-4.2.0/lib -lpq -o build/lib.macosx-10.6-x86_64-3.5/_pg.cpython-35m-darwin.so

ビルドすると、buildディレクトリが作られ、その中にビルドされたライブラリファイルが格納されます。

$ ls -l
total 672
-rw-r--r--@  1 hz  staff    1290  7 23  2017 LICENSE.txt
-rw-r--r--@  1 hz  staff     556  7 23  2017 MANIFEST.in
-rw-r--r--@  1 hz  staff    1362  7 23  2017 PKG-INFO
drwxr-xr-x@  7 hz  staff     224  7 23  2017 PyGreSQL.egg-info
-rw-r--r--@  1 hz  staff     859  7 23  2017 README.rst
drwxr-xr-x   4 hz  staff     128  4  1 06:19 build
drwxr-xr-x@ 15 hz  staff     480  7 23  2017 docs
-rw-r--r--@  1 hz  staff   96135  7 23  2017 pg.py
-rw-r--r--@  1 hz  staff   61267  7 23  2017 pgdb.py
-rw-r--r--@  1 hz  staff  145938  7 23  2017 pgmodule.c
-rw-r--r--@  1 hz  staff    3063  7 23  2017 pgtypes.h
-rw-r--r--@  1 hz  staff    3974  7 23  2017 py3c.h
-rw-r--r--@  1 hz  staff     165  7 23  2017 setup.cfg
-rwxr-xr-x@  1 hz  staff    8026  7 23  2017 setup.py
drwxr-xr-x@ 13 hz  staff     416  7 23  2017 tests

$ ls -l build
total 0
drwxr-xr-x  5 hz  staff  160  4  1 06:19 lib.macosx-10.6-x86_64-3.5
drwxr-xr-x  3 hz  staff   96  4  1 06:19 temp.macosx-10.6-x86_64-3.5

$ ls -l build/lib.macosx-10.6-x86_64-3.5/
total 520
-rwxr-xr-x  1 hz  staff  102644  4  1 06:19 _pg.cpython-35m-darwin.so
-rw-r--r--  1 hz  staff   96135  7 23  2017 pg.py
-rw-r--r--  1 hz  staff   61267  7 23  2017 pgdb.py

生成されたpg.pyの末尾、if __name__ == '__main__'の直前に、こんな一行を加えてみましょう。

# この一行を加える。
print('### built from source pg.py ###')

# if run as script, print some information

if __name__ == '__main__':
    print('PyGreSQL version' + version)
    print('')
    print(__doc__)

これで、import pgとやったときに、自分がビルドしたモジュールが読み込まれたことを確認できます。

importしてみる

Pythonの公式ドキュメントによると、import spamとコマンドを書いたときに、spamモジュールの検索順序は以下の通りです。

  1. 組み込みモジュールにspamという名前のモジュールがあれば、それをロードする。
  2. 見つからなければ、sys.pathにリストされているディレクトリを順に検索し、spamが見つかればそれをロードする。

ここで、sys.pathには初期値として以下のディレクトリがリストに含まれます。

  • 入力したスクリプトのディレクトリ。あるいは、スクリプトの指定がなければカレントディレクトリ。
  • 環境変数PYTHONPATH
  • インストール依存のデフォルト

というわけで、今回はビルドしたpg.pyがあるディレクトリに移動してからpythonを起動することで、ビルドしたpg.pyがモジュール検索時に見つかるようにしましょう。

$ cd build/lib.macosx-10.6-x86_64-3.5/
$ python

pythonインタプリタでimportしてみましょう。

> import pg
### built from source pg.py ###

追加した一行がプリントされ、自身でビルドしたモジュールが読み込まれたことを確認できました。

まとめ

公式ドキュメントの手順に従い、DistUtilsを利用してPyGreSQLをソースコードからビルドしてみました。
ビルドしたモジュールがロードされたことを確認しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0