Pythonでグローバルコマンドを含んだパッケージを作る

  • 4
    いいね
  • 0
    コメント

Pythonでグローバルコマンドを含んだパッケージを作ったので、そのメモ。

グローバルコマンドとは、/usr/local/bin/などの通常PATHが通っている場所にあるコマンドの事をいっており、/usr/local/bin/に任意のコマンドをpipでインストールできる事を目的とします。

環境

  • MacOS X 10.11.13
  • Python 2.7.10
  • setuptools (1.1.6)

構成

myapp/
  ├ setup.py
  └ myapp/
    ├ __init__.py
    └ main.py

setup.pyの内容

import setuptools 

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

entry_pointsで、実行するファイルと関数を指定している。
'myapp = myapp.main:main'は、myappという実行ファイルを実行すると、myapp/main.pyのmain関数を呼び出すということを意味している。

setuptools.find_packages()によって、__init__.pyがあるディレクトリをパッケージに入れる。

実際に実行する関数を格納したmain.pyの内容

import sys

def main():
    print(sys.argv)

パッケージの作成

$ python setup.py sdist

これでパッケージ本体 dist/myapp-0.0.1.tar.gz と、
メタデータディレクトリ myapp.egg-info/ ができる。

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

$ sudo pip install dist/myapp-0.0.1.tar.gz

手元のMacOS X環境では、以下のファイルがインストールされた

  /Library/Python/2.7/site-packages/myapp-0.0.1-py2.7.egg-info
  /Library/Python/2.7/site-packages/myapp/__init__.py
  /Library/Python/2.7/site-packages/myapp/__init__.pyc
  /Library/Python/2.7/site-packages/myapp/main.py
  /Library/Python/2.7/site-packages/myapp/main.pyc
  /usr/local/bin/myapp

/usr/local/bin/myappに実行ファイルが登録されているのが分かる

動作確認

これで、どこからでもmyappコマンドが打てるようになった

$ myapp hoge bar
['/usr/local/bin/myapp', 'hoge', 'bar']