Posted at

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

More than 1 year has passed since last update.

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']