LoginSignup
39

More than 5 years have passed since last update.

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39