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.py
がlesson_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を選びます。
パッケージの情報を入力するウインドウが表示されるので、必要な情報を入力して【OK】をクリックします。
今回はプロジェクト全体ではなく、下位層にあるsession6
というフォルダをパッケージ化するので、setup.py
をsession6
フォルダに移動します。
移動に関してのダイアログが表示されるので、【OK】をクリックします。
setup.py
を開いて、不必要なフォルダ名を削除します。
酒井さんの講座では、ルートに作成したものをそのまま使っていたのと、setuptools
ライブラリではなく、distutils
ライブラリを使っていたのですが、自動的に作成されたsetup.py
がsetuptools
ライブラリをインポートしていたので、そのまま使ってみました。
setup.pyを実行する
setup.py
の実行もPycharmのメニューから可能ですが、プロジェクトのルートフォルダにsetup.py
が配置されていないとメニューが有効にならないようです。
なので、ターミナルからコマンドを実行して、パッケージ化することにしました。
まずは、現在の階層が最初に作成したpython_programming
なので、cd
コマンドで、session6
に移動します。
その後、次のコマンドでsetup.py
を実行します。
python setup.py sdist
ターミナルでsetup.py
が実行されて、次のようなファイルがsession6
フォルダに作成されます。
作成された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
元のパッケージと見比べてみるとわかりますが、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のファイルをドロップボックスに保存できるように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!