LoginSignup
2
4

More than 3 years have passed since last update.

Pythonスクリプトをパッケージ化して配布する方法

Posted at

はじめに

トレロをコマンドラインから操作するスクリプトをPythonでつくったものの、同じコマンドをローカルのマックだけでなく作業専用のEC2でも実行したくなり、こちらの記事を参考にさせていただき、スクリプトのパッケージ化と配布方法を調べてまとめてみました。

環境

  • python 3.8
  • pip 20.1.1

ディレクトリ構成(STEP1)

配布を考えずにスクリプトを実装した初期の状態です。

trello-cli
|__ trello_cli
    ├── __init__.py #メインスクリプト
    |__ __main__.py #コマンドから呼ばれるファイル

最初のディレクトリ構成はこんな感じで、コマンドの実行は、

$ cd trello-cli
$ python -m trello-cli 

となり、trello-cliのディレクトリに移動する必要があります。また、このコマンドで、main.pyが実行されます。

__main__.pyの中身はこんな感じで、__init__.pyの中の、main()関数を呼び出しているだけです。実際の処理は、__init__.pyの、main()関数内に実装をしています。

__main__.py
from . import main

main()

依存するパッケージを管理する(STEP2)

このスクリプトを使用するために、pipインストールする必要があるものを保存します。

$ pip freeze > requirements.txt

私の場合ファイルの中身はこんな感じになりました。なんか色々と書かれていますが、必要だったのは、py-trelloと、python-dotenvです。

requirements.txt
certifi==2020.6.20
chardet==3.0.4
idna==2.10
oauthlib==3.1.0
py-trello==0.17.1
python-dateutil==2.8.1
python-dotenv==0.15.0
pytz==2020.4
requests==2.24.0
requests-oauthlib==1.3.0
six==1.15.0
urllib3==1.25.11

この時点でディレクトリ構成は以下のようになります。

trello-cli
├── requirements.txt
|__ trello_cli
    |__ __init__.py
    |__ __main__.py

setup.pyを書きます(STEP3)

setup.py
import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="Trello-CLI",
    version="0.0.1",
    install_requires=[
        "requests",
    ],
    entry_points={
        'console_scripts': ['trello=trello_cli:main'],
    },
    author="Yokohama",
    author_email="xxx@example.com",
    description="Trello card managment on CLI",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.8',
)
  • install_requiresにパッケージが依存するパッケージを書くと pip が自動インストールしてくれます。
  • entry_pointsconsole_scriptsで指定した内容が、コンソール上でコマンドとして実行できるようになります。この場合は、trelloコマンドで、trello-cli/__main__.pyが実行されます。

この時点でディレクトリ構成は以下のようになります。

trello-cli
├── requirements.txt
├── setup.py
|__ trello_cli
    |__ __init__.py
    |__ __main__.py

配布物を作る(STEP4)

いよいよこのスクリプトをpip installできる状態にします。

$ python setup.py bdist_wheel

そうすると、以下のディレクトリ構成図のように、distというディレクトリが作成され、その中にpip install用のファイルが作成されます。

trello-cli
├── dist
│   └── Trello_CLI-0.0.1-py3-none-any.whl
├── requirements.txt
├── setup.py
|__ trello_cli
    |__ __init__.py
    |__ __main__.py

実際にEC2上で使ってみる

今回の目的はローカルと同じコマンドをEC2上で使うことなので、作成した配布物を使って早速EC2上にインストールをしてみます。まず、仮想環境を使うにしても、pythonとpipはローカルと同じバージョンにしておく必要があります。

$ cd trello-cli
$ pip install ./trello-cli/dist/Trello_CLI-0.0.1-py3-none-any.whl
$ trello

ローカルと同じようにコマンドを実行することに成功しました。

課題

TrelloのAPI Keyなどソースコード中に書きたくないものは、python-dotenvを使い、.envファイルに記述をしたのですが、インストール先でも当然.envファイルを用意してあげないとエラーになります。

どの様な状況でpythonを実行しているかで、展開されるディレクトリの場所は変わりますが、私の場合はanacondaで実行しているため、~/anaconda3/lib/python3.8/site-packages/trello_cli/.envという、とんでもなく分かりづらい場所に、.envファイルを作成して上げる必要が有りました。

もっとスムーズにできる方法を知っている方いらっしゃいましたらコメント頂けますと幸いです。

参考

2
4
0

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
2
4