33
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

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']
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
33
Help us understand the problem. What are the problem?