Pycharm setup.py 使い方

Python学習【365日チャレンジ!】70日目のマスターU(@Udemy11)です。

Pythonistaでのパッケージ化を試みてハマってしまいました。
丸一日かけて試してみたのですが、どうもエラーが起こってパッケージ化できないんですよね。

こちらのページを参考にして、StaSh(Pythonista Shell)を使えるようにしたのですが、どうもうまくいかないんですよね〜。

酒井さんの講座の今回のレクチャーを参考にしながら、setup.pyを作成して、StaShでcdコマンドを使いsetup.pyを置いているディレクトリに移動したあと、python3 setup.py sdistを実行するのですが、うまくいきません。

いろいろ試してみるもうまくいかないし、いつまでも時間を費やしていられないので、とりあえず今回は、Pycharmで実践することにしました。

昨日の復習

昨日は、ImportErrorの処理の仕方について学習しました。

モジュールをインポートしようとしたときに、階層を変更したことでImportErrorが起こってしまうことがあります。

そんなエラーを起こさないように、try-except文を使って、ImportErrorを回避する方法を学習しました。

フォルダ階層

session5 ┳ lesson.py
         ┗ lesson_package ┳ __int__.py
                           ┗ second_drectry ┳ __int__.py
                                             ┗ test.py

lesson_package > second_directry > test.py

def cry():
    print('Oh my got!!')

lesson.py

try:
    from package import test
except ImportError:
    from lesson_package.second_directry import test

print(test.cry())

出力結果

Oh my got!!

上記のようなコードを書けば、test.pylesson_package内にあってもsecond_diredtryにあってもエラーを回避することができます。

配布するパッケージのバージョンによって、参照していた階層が変わってしまう場合などに使えるということでした。

詳しくはこちらのエントリーをごらんください。

今日は、作ったパッケージを配布する方法について学習します。

setup.pyとは

突然パッケージを配布するというチャプターが出てきたわけですが、以後のチャプターを解説する上で必要なのかと思いながらも、まだどんなパッケージを作るのかもわからない中で、配布と言われても。。。と思っちゃいました。

後回ししようかとおもいながら、とりあえずこんなことができるというイメージを掴んでおこうとおもいます。

まず、setup.pyがどんなファイルなのか簡単にまとめると次のようになります。

  • モジュールをまとめたパッケージを配布できるようにまとめるためのファイル
  • ライブラリのsetuptoolsを使って実行するファイル
  • プロジェクトのルートに作成するファイル

これだけではよくわからないと思いますが、とりあえず、自分が作ったパッケージを配布するために必要不可欠なものがsetup.pyと憶えておきましょう。

Pycharmを使えば、setup.pyを自動的に作成することができます。

Pythonistaでもできるでしょということで、いろいろと試したのですが、冒頭で紹介したように、ハマりにはまったので、Pycharmを使ったsetup.pyの使い方を紹介していきます。

setup.pyを作る

プロジェクトという概念を持っていなかったわたしは、Pycharmのプロジェクトの中に階層を作って、これまで学習したパッケージを作っていたので、それらをすべてパッケージ化するのもどうかと思ったので、下位層にあるフォルダのみをパッケージしてみることにしました。

Pycharmを使えば、setup.pyを自動的に作成できるのですが、基本的にはプロジェクトのルートに配置するもので、プロジェクト全体のパッケージをまとめるsetup.pyが作成されるので、下位層のフォルダをパッケージにするには、ちょっとした作業が必要です。

ToolsからCreat setup.py

メニューのToolsからCreat setup.pyを選びます。

Pycharm setup.py 使い方

パッケージの情報を入力するウインドウが表示されるので、必要な情報を入力して【OK】をクリックします。

Pycharm setup.py 使い方

今回はプロジェクト全体ではなく、下位層にあるsession6というフォルダをパッケージ化するので、setup.pysession6フォルダに移動します。

Pycharm setup.py 使い方

移動に関してのダイアログが表示されるので、【OK】をクリックします。

Pycharm setup.py 使い方

setup.pyを開いて、不必要なフォルダ名を削除します。

Pycharm setup.py 使い方

酒井さんの講座では、ルートに作成したものをそのまま使っていたのと、setuptoolsライブラリではなく、distutilsライブラリを使っていたのですが、自動的に作成されたsetup.pysetuptoolsライブラリをインポートしていたので、そのまま使ってみました。

setup.pyを実行する

setup.pyの実行もPycharmのメニューから可能ですが、プロジェクトのルートフォルダにsetup.pyが配置されていないとメニューが有効にならないようです。

Pycharm setup.py 使い方

なので、ターミナルからコマンドを実行して、パッケージ化することにしました。

まずは、現在の階層が最初に作成したpython_programmingなので、cdコマンドで、session6に移動します。

その後、次のコマンドでsetup.pyを実行します。

python setup.py sdist

Pycharm setup.py 使い方

ターミナルでsetup.pyが実行されて、次のようなファイルがsession6フォルダに作成されます。

Pycharm setup.py 使い方

作成されたmy_program-1.0.0.tar.gzがパッケージをまとめたものなので、このデータをWebで公開すれば、誰でも自分が作成したパッケージを使えるようになります。

次にmy_program-1.0.0.tar.gzを展開してみます。

参考までに、ターミナルでtar.gzを展開するコマンドは次のとおりです

tar zxvf my_program-1.0.0.tar.gz

Pycharm setup.py 使い方

元のパッケージと見比べてみるとわかりますが、lesson6.pyは含まれておらず、次のようなファイルが追加されています。

  • my_program.egg-infoフォルダ
  • dependenry_links.txt
  • PKG-INFO
  • SOURCES.txt
  • top_level.txt
  • setup.cfg

PKG-INFOは2つありますが、内容は同じものです。

追加されたファイルの中身

それぞれのファイルの中身をみてみましょう。

dependenry_links.txt

中身はなし

PKG-INFO

Metadata-Version: 1.0
Name: my-program
Version: 1.0.0
Summary: example_packagae
Home-page: https://udemyfun.com/
Author: MasterU
Author-email: master@udemyfun.com
License: Free
Description: UNKNOWN
Platform: UNKNOWN

setup.pyに入力した情報が収められているのがこのファイルです。

SOURCES.txt

setup.py
lesson_package/__init__.py
lesson_package/talk/__init__.py
lesson_package/talk/animal.py
lesson_package/talk/human.py
lesson_package/tools/__init__.py
lesson_package/tools/utils.py
my_program.egg-info/PKG-INFO
my_program.egg-info/SOURCES.txt
my_program.egg-info/dependency_links.txt
my_program.egg-info/top_level.txt

こちらは、ソース、つまりファイルの一覧が記載されています。

top_level.txt

lesson_package

ファイル名のままですね。

setup.cfg

[egg_info]
tag_build = 
tag_date = 0

setuptoolsライブラリを使ってsetup.pyを実行してパッケージ化する際のオプション情報を読み込むファイルで、setup.py実行時に存在しない場合は勝手に作られるようです。

挫折も経験

これまでコードはPythonistaを使って書いて、記事にするときに書いたコードは、Pycharmで実行できるか確認していました。

なので、今回のパッケージ化もPythonistaで挑戦してみましたが、どうにもうまくいきませんでした。

Pythonista setuptools

Pythonistaのファイルをドロップボックスに保存できるようにStaShをセットアップしていたので、コマンドを実行すれば、パッケージ化できると思っていたのですが、かなりハマって時間を費やしてしまいました。

最初は、講座で解説されていたdistutilsライブラリも試してみたのですがうまくいかず、サードパーティーのsetuptoolsライブラリをpipでインストールして使ってみるもうまくいかず、Pythonistaのディレクトリ構造をチェックしてみたりとPythonistaのことがちょっとだけ詳しくなりました。

よくよくStaShの画面をみてみると、

Warning: you are running StaSh in python3. Some commands may not work correctly in python3.

なんてことが書かれているんですよね。

Pythonistaでできることは多いけど、できないこともあるということで、できないときは普通にPycharmを使っていこうと思います。

それでは明日もGood Python!