Help us understand the problem. What is going on with this article?

自分で作ったPythonの野球ライブラリをパッケージング&PyPIに公開してみた

More than 3 years have passed since last update.

2016年初エントリーですね.

今年もPythonと野球ネタ中心で学びをストックしたいと思います.

よろしくお願いします!

やったこと

  • MLB一球速報データを取得&前処理してデータセット(CSVファイル)に落とすPythonライブラリを開発
  • コマンドラインアプリ化
  • パッケージング
  • PyPIに登録&公開
  • pipで入れて動かす

パッケージング&PyPI公開はこちらの書籍を参考にさせて頂きました.

Pythonプロフェッショナルプログラミング第2版(通称:Pyプロ本・Python黒本)

MLB一球速報データを取得&前処理してデータセット(CSVファイル)に落とすPythonライブラリを開発

MLBAMの一球速報データ(XML)を取得、スクレイピングしてCSVとしてダウンロードするスクリプトを作りました.

pitchpx(GitHub)

何が出来るのかはこちらの投稿を参照ください.

メジャーリーグの一球速報データをPyDataできるようにしてみました(まだ途中) #大晦日ハッカソン

まだ出来は荒っぽいですが最低限使える所までできました.

コマンドラインアプリ化

何となくデータ分析に使える所までいったので、せっかくだからパッケージにして野球好きが気軽に使えるようにしよう!ということで、

  • 作ったライブラリ「pitchpx」をコマンドライン化
  • PyPIに登録して気軽に利用可能に

という感じで公開することにしました.

コマンドライン化については、元々そのつもりで作っていたのでアッサリ出来ました.

コマンドラインオプションの定義と制御はclickという超便利なライブラリのおかげで楽に出来ました.

click(Python)

click(とfabricの合わせ技)については以下のスライドに実例があります(大変わかり易い!)

3分でサーバオペレーションコマンドを作る技術(slideshare)

パッケージング

Python歴5年目にして初めてチャレンジしました(震え声)

配布形式はWheelです.

手順はこんな感じ.

  1. wheelライブラリをインストール
  2. setup.pyを書く・テストする
  3. 配布パッケージを作る

wheelライブラリをインストール

pip install wheel

以上

setup.pyを書く・テストする

Pyプロ本の第三章および、Python公式の「setup スクリプトを書く」を参考に記述しました.

setup.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

__author__ = 'Shinichi Nakagawa'


setup(
    name='pitchpx',  # ライブラリの名前
    version='1.0',  # バージョン
    description='Tools for Acquiring MLBAM Gameday dataset',  # 解説
    author='Shinichi Nakagawa',  # 作った人
    author_email='hogefuga@gmail.com',  # 作った人の連絡先
    url='https://github.com/Shinichi-Nakagawa/pitchpx',  # URL(Githubリポジトリ)
    classifiers=[  # 注記事項(開発ステータス,利用目的,LICENSEなど)
        'Development Status :: 4 - Beta',
        'Intended Audience :: Science/Research',
        'License :: OSI Approved :: MIT License',
        'Natural Language :: English',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3 :: Only',
    ],
    packages=find_packages(),  # 梱包するコードの場所. setuptoolsのfind_packages()でパッケージなdirectoryを捜索&よしなに突っ込んでくれます
    include_package_data=True,  # ソースコード(*.py)以外のファイルも入れるか否か
    keywords=['baseball', 'MLB', 'MLBAM'],  # キーワード
    license='MIT License',  # ライセンス
    install_requires=[  # 依存ライブラリ
        'beautifulsoup4',
        'click',
        'FormEncode',
        'lxml',
        'python-dateutil',
        'pytz',
        'PyYAML',
    ],
    entry_points="""  # コマンドラインにするときのエントリーポイント、pitchpx/__init__.pyの関数をエントリーポイントにしました.
        [console_scripts]
        pitchpx = pitchpx:main
    """,
)

できたら試しに動かしてみます

$ pip install -e .

何事も無くインストール終了&コマンドが無事使えたらOKです.

$ pitchpx -s 20150812 -e 20150813 -o ~/Download # 2015/8/12-8/13までの試合結果を~/Downloadに落とす

配布パッケージを作る

Wheelでの配布なのでコマンドはこんな感じ.

$ python setup.py bdist_wheel

上手く行ったっぽいです.

$ ls ./dist
pitchpx-1.0-py3-none-any.whl

他の言語も含め、パッケージ作って公開なんてしたことが無かったのでビビっていたのですが、ここまで割とアッサリできました.

作ったライブラリをPyPIに登録&公開

PyPIにユーザー登録

登録フォーム(https://pypi.python.org/pypi?%3Aaction=register_form)に名前とメアド、パスワードを入れて終了.

パッケージを登録

$ python setup.py register

選択肢が出てきたら「2」を選択、先ほど登録したユーザー名とパスワードで登録を行います.

パッケージをアップロード

$ python setup.py bdist_wheel upload

パッケージ登録にしくじっていなければこれでイケます.

これで上手く行っていればpip installで動くはず!

pipで入れて動かす

別のdirectoryに動いてvirtualenvで環境を準備、試しに動かしてみます.

$ pyenv virtualenv 3.5.1 pitchpx-test # pyenv install 3.5.1 ですでにPython 3.5.1が入ってる前提
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/local/Cellar/pyenv/20151222/versions/3.5.1/envs/pitchpx-test/lib/python3.5/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /usr/local/Cellar/pyenv/20151222/versions/3.5.1/envs/pitchpx-test/lib/python3.5/site-packages
pyenv-virtualenv: deactivate
pyenv-virtualenv: activate pitchpx-test
$ pip install pitchpx
Collecting pitchpx
Using cached pitchpx-1.0-py3-none-any.whl
Collecting python-dateutil (from pitchpx)
Using cached python_dateutil-2.4.2-py2.py3-none-any.whl
Collecting lxml (from pitchpx)
Collecting FormEncode (from pitchpx)
Collecting beautifulsoup4 (from pitchpx)
Using cached beautifulsoup4-4.4.1-py3-none-any.whl
Collecting pytz (from pitchpx)
Using cached pytz-2015.7-py2.py3-none-any.whl
Collecting click (from pitchpx)
Using cached click-6.2-py2.py3-none-any.whl
Collecting PyYAML (from pitchpx)
Collecting six>=1.5 (from python-dateutil->pitchpx)
Using cached six-1.10.0-py2.py3-none-any.whl
Installing collected packages: six, python-dateutil, lxml, FormEncode, beautifulsoup4, pytz, click, PyYAML, pitchpx
Successfully installed FormEncode-1.3.0 PyYAML-3.11 beautifulsoup4-4.4.1 click-6.2 lxml-3.5.0 pitchpx-1.0 python-dateutil-2.4.2 pytz-2015.7 six-1.10.0
$ pip freeze
beautifulsoup4==4.4.1
click==6.2
FormEncode==1.3.0
lxml==3.5.0
pitchpx==1.0
python-dateutil==2.4.2
pytz==2015.7
PyYAML==3.11
six==1.10.0
$ pitchpx -s 20150812 -e 20150813 -o ~/Downloads/

無事にダウンロード出来ました(^O^)

$ ls -l ~/Downloads/ | grep mlbam*
-rw-r--r-- 1 hoge staff 334766 1 2 17:22 mlbam_atbat_20150812.csv
-rw-r--r-- 1 hoge staff 208526 1 2 17:23 mlbam_atbat_20150813.csv
-rw-r--r-- 1 hoge staff 1695169 1 2 17:22 mlbam_pitch_20150812.csv
-rw-r--r-- 1 hoge staff 1078535 1 2 17:23 mlbam_pitch_20150813.csv

学び&今後

コマンド&パッケージ&配布

  • clickくっそ便利.
  • パッケージ化は思ったより楽だった.
  • 今後はなにか作る時は必ずsetup.pyを書く癖をつけよう.
  • 困ったときのPyプロ本、Pythonistaなら確実に役立つネタだらけで素晴らしい.

ライブラリ

  • 目的どおり動いてるっぽくて良かった.
  • 打席(atbat)および投球(pitch)のテストが済んでいないのでちゃんとやりたい.
  • それ以上にPython3.5.x専用なのを何とかせねば.
  • なお、Python2対応はしない模様.

etc

  • 次はデータ分析と可視化頑張る.
  • 年末年始休みの宿題が無事終わって良かった.
  • やっぱプログラミング楽しい.
shinyorke
Senior Engineer, Baseball Analyst/Scientist Web/Python/Data Science/Baseball Science(SABRmetrics)/etc...
http://shinyorke.hatenablog.com/
jxpress
技術力で「ニュースの産業革命」を起こす。言語処理・データ解析分野の専門家が集まる、News Techベンチャー。
https://jxpress.net/
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