Python: コマンドを含むwheelパッケージを作る

Python のパッケージというと、以前は Egg だったけど最近では wheel パッケージが増えているようだ。Egg パッケージは一度作ってみたことがあるので、今回は wheel パッケージを作ってみる。ついでに、ライブラリではなく、実行できるコマンドを含んだパッケージを作る。

環境

  • Ubuntu 16.04 LTS
  • Python 2.7.12
  • wheel 0.29.0

ソースファイル

ソースの構成はこう:

takatoh@apostrophe $ tree .
.
├── myapp
│   ├── __init__.py
│   └── main.py
└── setup.py

1 directory, 3 files

myapp/main.py が実行されるコマンドのソースで、setup.py が wheel パッケージを作るためのファイル。

import sys

def main():
    print(sys.argv)
import setuptools

setuptools.setup(
    name='myapp',
    version='0.0.1',
    packages=setuptools.find_packages(),
    entry_points={
        'console_scripts':[
            'myapp=myapp.main:main'
        ]
    }
)

myapp/main.py は main 関数があるだけ。setup.py も最低限だけど、色を付けた行が実行コマンドを指定していて、'myapp=myapp.main:main'myapp コマンドを実行すると myapp/main.py の main 関数を呼び出すことを意味している。myapp/__init__.py は空でいい。

wheelパッケージの作成

setup.py にパラメータとして bdist_wheel を渡してやる。

takatoh@apostrophe $ python setup.py bdist_wheel
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/myapp
copying myapp/main.py -> build/lib.linux-x86_64-2.7/myapp
copying myapp/__init__.py -> build/lib.linux-x86_64-2.7/myapp
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/myapp
copying build/lib.linux-x86_64-2.7/myapp/main.py -> build/bdist.linux-x86_64/wheel/myapp
copying build/lib.linux-x86_64-2.7/myapp/__init__.py -> build/bdist.linux-x86_64/wheel/myapp
running install_egg_info
running egg_info
creating myapp.egg-info
writing myapp.egg-info/PKG-INFO
writing top-level names to myapp.egg-info/top_level.txt
writing dependency_links to myapp.egg-info/dependency_links.txt
writing entry points to myapp.egg-info/entry_points.txt
writing manifest file 'myapp.egg-info/SOURCES.txt'
reading manifest file 'myapp.egg-info/SOURCES.txt'
writing manifest file 'myapp.egg-info/SOURCES.txt'
Copying myapp.egg-info to build/bdist.linux-x86_64/wheel/myapp-0.0.1.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/myapp-0.0.1.dist-info/WHEEL

すると dist ディレクトリに wheel パッケージができる。

takatoh@apostrophe $ ls dist
myapp-0.0.1-py2-none-any.whl

インストールと確認

インストールは普通に sudo pip install で。

takatoh@apostrophe $ sudo pip install dist/myapp-0.0.1-py2-none-any.whl
Processing ./dist/myapp-0.0.1-py2-none-any.whl
Installing collected packages: myapp
Successfully installed myapp-0.0.1

テスト。

takatoh@apostrophe $ myapp foo bar baz
['/usr/local/bin/myapp', 'foo', 'bar', 'baz']

うまく行った。myapp コマンドが /use/local/bin/myapp にインストールされているのがわかる。

参考ページ

 cf. Pythonでグローバルコマンドを含んだパッケージを作る – Qiita
 cf. Python: Wheel でパッケージを配布する – CUBE SUGAR STORAGE

Elixir 練習問題 StringsAndBinaries-3

ここのところ Ubuntu ばかりやっていたので、Elixir は久しぶり。

今日の練習問題は、['cat' | 'dog'] という式が、なぜ ['cat', 100, 111, 103] になるのかという問題。まずは実際に確かめてみよう。

^o^ > iex
Eshell V8.0  (abort with ^G)
Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> ['cat' | 'dog']
['cat', 100, 111, 103]

まあ、答えは簡単だ。シングルクォートで囲まれた 'dog' は実はただの整数のリストで、たまたまその整数すべてが文字コードとして解釈できるから 'dog' になっているにすぎない。

iex(2)> [100, 111, 103]
'dog'

ところが、このリストの先頭に 'cat' を追加してしまうと、すべてが文字コードとして解釈できる整数ではなくなってしまう。もう少し正確に言うと、リストの最初の要素がリスト、残りが整数になってしまっている。だから、後ろの3要素は文字ではなく文字コードで表示されている。