メモの日々


2017年04月14日(金) [長年日記]

[python] Pythonにおけるパッケージング

久々にPythonを使う。Python製アプリケーションのパッケージングに関してメモ。CentOS 7.3を使っていてPythonのバージョンは2.7.5(古い)。

情報源としては

をまず見るべきなのだと思う。

setuptoolsをインストール

Pythonのパッケージ関連ツールはややこしくてなかなか覚えられないのだけれど、パッケージングを行うにはsetuptoolsを使うのがいいみたい。

setuptoolsはCentOS 7の標準パッケージにもあるけれど、今回はpipも使いたいのでsetuptoolsはpip経由でインストールすることにする。

pipはCentOS 7だと標準パッケージにはなくEPELにはあるみたい。が、今回はこれも使わずget-pip.pyを使ってインストールする。

% python get-pip.py --user

これで ~/.local に色々ファイルが作られる。pipコマンドは ~/.local/bin にインストールされるのでここにパスを通す必要がある。

get-pip.pyはpip以外にもいくつかパッケージをインストールしていて、その中にsetuptoolsも含まれておりこれでsetuptoolsのインストールが完了した。

setup.pyを作る

setuptoolsを使うとPythonアプリケーションのパッケージングを行うスクリプトを簡単に書ける。スクリプトは通常setup.pyという名前にする模様。次のように書いた。

from setuptools import setup, find_packages

setup(
    name="oreore",
    packages=find_packages(),
)

setup()には引数がたくさんあるのだけれど、ひとまずはnameとpackagesだけ指定すればよさそう。find_packages()は引数に何も指定しないとカレントディレクトリ配下のPythonモジュールを列挙するようだ。

Pythonのコードを用意

適当にPythonのコードを置いてみる。

% tree .
.
├── hello
│   ├── __init__.py
│   └── hello.py
├── setup.py
└── world
    ├── __init__.py
    └── world.py

hello.pyはライブラリではなく実行できるスクリプトだということにする。スクリプトはsetup.pyに指定しておく必要があり、setup.pyのsetup()の引数にscriptsを追加する。

from setuptools import setup, find_packages

setup(
    name="oreore",
    packages=find_packages(),
    scripts=["hello/hello.py"],
)

なお、entry_pointsという引数に"console_scripts"をキーとした辞書を渡すことでモジュール内の関数を呼び出すスクリプトを生成させることができるようで、この仕組みを使う方が推奨されているみたい。だが今回はこれは使わない。

Wheelパッケージを作る

作ったコード群をパッケージングしてみる。パッケージはWheelという形式で作るのがよさそう。setup.pyにbdist_wheelコマンドを指定すると作れる。

% python setup.py bdist_wheel

カレントディレクトリは次のようになった。

% tree .
.
├── build
│   ├── bdist.linux-x86_64
│   ├── lib
│   │   ├── hello
│   │   │   ├── __init__.py
│   │   │   └── hello.py
│   │   └── world
│   │       ├── __init__.py
│   │       └── world.py
│   └── scripts-2.7
│       └── hello.py
├── dist
│   └── oreore-0.0.0-py2-none-any.whl
├── hello
│   ├── __init__.py
│   └── hello.py
├── oreore.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── setup.py
└── world
    ├── __init__.py
    └── world.py

これの dist/oreore-0.0.0-py2-none-any.whl がWheelパッケージ。

パッケージのインストール

作ったwhlファイルのインストールを試してみる。インストールにはpipを使う。

% pip install dist/oreore-0.0.0-py2-none-any.whl --user

これで ~/.local 配下にインストールされる。

  • ~/.local/lib/python2.7/site-packages/oreore-0.0.0.dist-info/
  • ~/.local/lib/python2.7/site-packages/hello/
  • ~/.local/lib/python2.7/site-packages/world/
  • ~/.local/bin/hello.py

という風に配置された。