いいものをつくろう

CTOの日記

python

pythonのライブラリの作り方

投稿日:

pip install numpy

みたいにできるpackageをつくりましょう。

 

sample codeはこちら で、folder構成は

├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.rst
├── docs
│   ├── Makefile
│   ├── conf.py
│   ├── index.rst
│   └── make.bat
├── hoge_hoge
│   ├── __init__.py
│   ├── core.py
│   └── helpers.py
├── requirements.txt
├── setup.py
└── tests
    ├── __init__.py
    ├── context.py
    ├── test_advanced.py
    └── test_basic.py

 

大事なのはsetup.pyです。

setup.pyを書くというのはpackageをつくるということです。setup.pyはDistutilsのラッパーというか窓口と考えて

考えています。詳しくdistutilsを知らたい方は別途しらべてみてください。

 

setup.pyの内容は一行一行は簡単で、名前とかバージョンとか、ちょととややこし目は依存パッケージとか。が基本です

でも、本当に簡単なので恐れないで。

from setuptools import setup, find_packages

setup(
    name='パッケージ名',
    version="0.0.1",                 # X.Y.Z 形式
    description="短めの説明",
    long_description="長めの説明",
    url='必要ならばURL',
    author='作者名',
    author_email='メールアドレス',
    license='ライセンス',
    classifiers=[
        # パッケージのカテゴリー
        # https://pypi.python.org/pypi?:action=list_classifiers
        # から該当しそなもを選んでおけばよい。
    ],
    keywords='キーワード',
    install_requires=["依存関係のあるパッケージ"],
)

メタデータ一覧はこちら

setup.pyが書けたならそれをインストールするには

pip install -e ./hoge_hoge
or
python setup.py develop
or
python setup.py install

python setup.py developは開発中のフォルダで一回、このコマンドでインストールした後でソース変更してもイチイチ python setup.py installしなくてよい。

逆にpython setup.py installはいわゆる普通のインストールです。私はpython setup.py install しかしたことがなかったです。

 

ちなみにsetup.pyの内容をyamlでsetup.cfgに書くこともできます。link

より綺麗に管理したい場合にお勧めです。

 

他にもtox.iniを採用しているチームもあるでしょう。

これはテストツールになります。ですのでパッケージングの本記事では詳しくは説明しませんが

setup.pyと同階層にtox.iniがあれば、お!?テストツールにtoxを採用しているんだな、くらいに思っておけばいいです。

toxとは簡単にいえばいろんなpython version環境下でテストを行えるツールです。例えばpython2.7とpython3.6でのテストを実行させたい

などなど。

 

こんな書き方を見たことがあるかもしれません。これは

#__init__.py

__path__ = __import__('pkgutil').extend_path(__path__, __name__)

ネームスペースパッケージとして追加するという意味です。python3.3以降はこんなのを書かなくても__init__.pyがないディレクトリは自動的に

ネームスペースパッケージとして扱われるようになりました。

ネームスペースパッケージとは、マージ可能なパッケージとでいいましょうか。こちらの記事が詳しいです。

あ、よく会社や組織のパッケージングでは company.payment.banker

例えばcompanyという会社のpayment組織がbankerというパッケージを開発していたら、おそらく

company自体はネーミングパッケージで良さそうです。様々な組織が同一ネーミングパッケージで開発すること

でインポートする側(実際にインストールして使う人たち)はcompany.innovation.solutionとかいうパッケージを同じく

companyはネーミングパッケージでつくっておくと

pip install banker, pip install solutionとすると、それぞれ

from company.innovation import solution
from company.payment import banker

のように、できるって感じですね。

 

あと

根本の__init__.pyに__version__を書いているライブラリが結構ありますが、これですね。

__version__ = '0.0.1'

個人的には

なくていいと思います。setup.pyでバージョン書いているので、二重管理になりすし。

 

以上です、が

あとカバーしたい内容としては

「python ドキュメントの作り方」(sphinxが多いかな。)

「パッケージをpypiに登録してpipできるよにする方法」

がありますが、この言葉、そのままググっても沢山情報がでてくると思いますので、一旦それで良いかと。

 

以上です

 

参考;

https://stackoverflow.com/questions/19048732/python-setup-py-develop-vs-install

simple python packaging, python packaging for intern

no need for __version__ in __init__.py because of setup.py

python packages not on PYPI

-python

Copyright© CTOの日記 , 2020 All Rights Reserved.