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