Yuuuiです。

今回はこちらの「Pythonの自作モジュール作成勉強会」にサポート役として参加しました!
ともともさん曰く、今回の勉強内容は「Python入門に比べるとレベル10くらい」ということでかなりレベルアップした内容になっています😳
最初に正直に白状しますが、今回学んだ内容について放送に参加している時点では、あんまり理解できませんでした…!😂
というのも、私はまだ「print(yuuui)」とか「if yuuui=music:」みたいな基礎の基礎部分を勉強中で、それらをしっかり理解できるまでのレベルには達していなかったのです😭
だから今回の勉強会でも、最初の方にめちゃくちゃコードの書き方について質問しまくって「このままだと最後までいかなくなっちゃうから…」ってみなさんを困らせてしまいました、、(ツクレルのみなさますみませんでした…!😢)
でもね、だからといって今回参加した意味がなかったかというとまったくそうじゃなくて。
プログラミングを勉強したての頃ってすべてが初めてだから、とりあえず勉強してみるけど開始早々知らない単語連発でもうすべてが???って感じで「何がわからないかわからない」みたいな状況に陥ることってありませんか?
また、そもそもプログラミングって「作るための手段」なので、「つくりたいもの」が明確になってないとどんなに「print()」とか勉強しても身に付きづらい、応用しづらいなというのを感じていて。
だから今回のように、「今は理解できないけどこういうことができるんだ」ということがなんとなくでも分かれば、「じゃあ私はこれをできるようになるために、今はこの部分を集中して勉強しよう」とか「これができるようになればあんなこともできるな、なるほど」とか、視界がクリアになって短期的な目標を立てやすくなると思うのです。ひとりで学んでいるとどこから手をつけたらいいか迷ってしまいがちだと思うのですが、それらを教えてくれる方がいてわからないことがあればすぐ聞けるという環境があるというのは改めて考えるとすごいことでは?と思います。
そして最初は全然分からなかった私も、この記事を書くために自分で書いて、実行して、というのを繰り返すうちに、なんとなくだけど理解できるようになっていきました!
勉強するきっかけをくれたツクレルさんに感謝ですね!
なので今回の勉強会レポについては、私のような初心者に向けて「「自作モジュール作成」とはどんなものか?」をできるだけ初心者視点でわかりやすくお伝えする、をテーマに書いていきたいと思います。
それでは参りましょう!
今回の勉強会のゴール🥐
PythonでBMIを計測するモジュールを作成して、ローカル環境にパッケージとしてインストールするのを体験しましょう。5.3の「作成したパッケージをインストールしよう」まで行うのが本日のゴールです。
(以上、ツクレル勉強会レジュメより抜粋)
「モジュール」とは?
まず初心者は「モジュールって…?」となると思うのですが、それについては今回使用するツクレル教材の方でも解説してくださっています。
モジュールとはプログラムにおける「部品」のようなもので、それ単体でも機能しますが基本的には別のプログラムで使用するためのものです。書いたプログラムをモジュールにすることで、作成したプログラムを別の用途に使いやすくなるというメリットがあります。
(以上、ツクレル教材「Pythonのモジュールを自作しよう」より抜粋)
こちらの説明をもう少し噛み砕くと・・・
今回はまず「BMIを測定する」という機能を持ったプログラムを作成するところからスタートするのですが、このプログラム自体はそのまま何もしなくても単体で使うことができます。しかし同じような機能を持ったプログラムを別のプログラムでも使いたいとなったとき、毎回作り直すのでは手間がかかってしまいます。
そういったときに、プログラムを「部品化」つまり「モジュール化」しておくことでより簡単に機能を追加したり、交換したりできようになるので非常に便利なのです。要するに「BMI測定」という機能持った「部品(モジュール)」として独立させておくということです。
そしてモジュール化することのもうひとつのメリットは「パッケージ化することでGitHubなどを利用して公開し、他の人に使ってもらう」なんてこともできちゃう点です。
今回のゴールに書かれている「ローカル環境にパッケージとしてインストールするのを体験しましょう。」というのはまさに「他の人も使える状態にするという手順を体験しよう」というお話でございます。モジュール化しただけでは作成者しか使えないので、パッケージ化しましょうね、ということです。
よって、今回の勉強会のゴールは「Pythonで作ったBMI測定プログラムを部品化(モジュール化)し、みんなに共有できるようにパッケージを作ってみましょう!」ということです!
(GitHubへの公開方法などについてはツクレル教材の最後の方でも触れているのでご興味があればこちらからどうぞ!)
※ローカル環境?🤔という方はこちらの過去記事でちょっと触れていますのでよろしければ。。
BMIを計算するモジュールを作る
さて、今回もgoogle colaboratoryを使って進めます。
●Yuuui’s memo●
本当は以前の記事で使ったMAMPを今回も使おうと思ったのですが、Pythonのプログラムを実行できるツールではなかったようで…Twitterでご教示いただきながらいろいろ試行錯誤してターミナルで実行するというところまでは辿り着いたものの、みなさまへお見せするには非常に見づらいものになっているので今回もGoogle Colaboratoryを使ってやっていきます。
初心者はいろんな前提条件を理解せずエラーに引っかかるので、原因を探るのもひと苦労だし、その問題に答える側も大変だと思います。そんななか丁寧に教えていただいた方々には頭が上がりません…。本当にありがとうございました。
いつか「ツールはこれが使いやすいよ!」とかお勧めできるレベルになりたいです…。
ご参考までにこちらも載せておきますね。
【Python入門】Pythonコードの実行方法をまとめてみた
今回は「プログラミングを書くこと」が目的ではなく「概念としてどういうものかを理解する」というのがテーマなので細かいコードの意味などには触れません。
コードの意味が気になる!という方や一緒にやってみたい!という方はツクレル教材からコードをコピーすることができますので、そちらを使っていただくと非常に便利かと思います。
また初めてGoogle Colabを使う方へ、知っておいたほうがよいかな〜と思った情報を共有しておきますと、
GoogleColabは
・90分間作業しない
・作業開始から12時間経過
どちらかの条件でインスタンスが落ちる仕組みになってます。
プログラミングしながら調べ物をしていたら、いざ作業再開しようと思ったときに「消えてる…」という悲しい結末にならないように注意しましょう。
(Google Colaboratoryについての詳しい解説はこちらで見られます)
▼まず今回の「BMI測定プログラム」はこちら。
視認性を重視してこちらは別のテキストエディタに表示させていますが、実際の手順はGoogle Colabで行っていきます。

最後のbmi_calc(60,165)ですが、こちらがそれぞれ
・60=weight:体重
・165=height:身長
を入力する部分になっております。
なのでざっくりいうとこちらの値を自由に入力変更して実行することで、BMIを測定できるという仕組みになっております。
それでは実際にやっていきましょう!
ファイル作成手順
①まず、Google Colaboratoryを開き、「.py」という拡張子で新しいファイルを作成します。
▼今回はデフォルトで入っている「sample_deta」というファイルの中に保存します。
「新しいファイル」を選択し、ファイル名を「bmi.py」として保存します。

②作った「bmi.py」をダブルクリックすると、右側にコードエディタが出てきますのでそちらに先ほどのプログラムのコードを貼り付けます。


▼保存するときは「ファイル」タブからでもできますが、表示がある通りショートカットキーを使ったほうが早いし今後便利なので「Command+SまたはCtrl+S」でやってみましょう。

保存する前に、「bmi_calc(60,165)」に入力してある内容は削除し、「bmi_calc()」の状態にしておいてください。
(説明時に見やすくするために入力しておいただけなので)
保存ができたら次に、作成したプログラムが正しく動作するかを確認します。
プログラムの動作確認
<確認手順>
先ほどファイルを作成したときに「sample_data」というフォルダの中に保存しましたが、まずはじめに「bmi.py」が間違いなくその場所にあるかどうかを確認します。
というのも、プログラミングする際は「どこの場所」の「どのファイル」というのを正確に定義してあげないとプログラムが正しく実行されず、エラーが出てしまうので意外と大事な手順だったりします。
「ls(list segmentsの略)」というコマンドを使用すると、そのファイルの情報を確認することができます。
(lsコマンドについて詳しく知りたい方はこちら)
▼Google Colabで実行するには先頭に「!」をつける必要があるため、「!ls」と入力し、再生ボタンクリックor Command+Enterで実行します。

すると「sample_data」と表示されました。
これで無事に「bmi.py」が「sample_data」にありますよ〜ということがわかりました。
ファイルの場所が正しいことを確認できたら、次に動作テストです。
<動作テスト手順>
とりあえず最初に入力しておいた数値、体重=60kg、身長=165cmで問題なく動くかどうか見てみましょう。
ただしこちらを実行するためには「importメソッド」を使用してモジュールを読み込む必要があります。
●Yuuui’smemo●
「え、さっきプログラム書いたじゃん」と思われると思うのですが(私も思った)、本来Pythonには「組み込み関数」といってPython言語に最初から用意されているメソッドがあり、それ以外は使う前に読み込む必要があります。
(関数?メソッド?🤔という方はこちら→関数とメソッドの違いとは)
要するに今回は使うモジュールは「BMI測定」という機能を持った独自のモジュール(デフォルトで入っていないもの)であり、単に「モジュールを作った=部品を作った」だけなので動かすことはできません。
よって、動かすためにはimport(組み込む)が必要ということになります。
さあ、それではimportしてみましょうか。
以下ツクレル教材より抜粋
体重60身長165と仮定して関数を呼び出します。
新しくセルを追加して下記のコードを実行しましょう。
#bmi.pyをimportする
import bmi
#bmi.pyの中の関数bmi.bmi_cluc()に引数を与えて実行
bmi.bmi_calc(60,165)
上記のコードを実行しましょう。
BMI: 22
判定: 標準体型
(22, ‘標準体型’)
上記のようにBMIと体型が取得でたら無事に動作テスト成功です。
ということで、
新しくセルを追加して実行してみます。

で・き・た!
…という方は実際どれくらいいるのでしょうか?
というのも、私はこれを表示させるために半日以上費やしてエラーを解決しました。
エラー原因がわからなすぎてテンパってうっかり画面をスクショし忘れてしまったのですが、最初に実行したときは「Module Not Found Error」つまり「指定のモジュール探したけどなかったよ」というエラーが出てきました。
なぜ???指定フォルダの中にモジュールは保存されているし、ファイル名も間違ってないし、、何なん????😇
半狂乱になりながらひたすらGoogle先生に教えを乞うていました。
解決方法を探すこと数時間・・・
私と同じ状況に陥ったとみられる方のブログを発見。
▼今回参考にさせていただいた「Pで作業軽減しましょ」の該当ページ

これがなかったら今も泣きべそかきながらインターネットの海を彷徨っていたことでしょう…。ありがとうございます。
詳細は割愛させていただきますが、Google Colabで作成したファイルはGoogleDriveの指定フォルダへ自動的に保存されるようになっているため、初めて使用する際にはGoogleDriveからモジュールをインポートするときにも同様のエラーが起きることがあるようです。
<エラー解消手順>
まず「GoogleDriveへのマウント」というプログラムを実行し、ファイルへのアクセス権を付与します。
▼左上のフォルダマークをクリックします

▼ポップアップが出るので「GOOGLEドライブに接続」をクリックします

▼正常に許可できるとアイコン表示が変わります

これでGoogleDriveへのマウント=ファイルへのアクセス権を付与できました。
そしてこのあといよいよ当該エラー解消のためのコードを入力して実行します。
どうやら「Module Not Found Error」を解消するには「ファイル(モジュール)の場所を指定してあげればいい」模様(と推測)。
具体的には「パスを通すことでファイル(モジュール)を見つけられるようにする」ということのようです。
入力するコードは以下になっております。
import sys
sys.path.append(‘/content/sample_data/’)
(’ ‘)のなかに入るパスは該当ファイルの右側にある点々の部分を選択、クリックすることでコピーできますので、別ファイルで同じ問題が起きたときはこの部分を置き換えればよさそうです。

▼そしてこちらを実行したあとにimport、計算を実行すると・・・

▼できました!

どうでしょうか?Module Not Found Errorエラーが出てしまった方はこちらで解決できるか、お試しください。
pipコマンドでインストールできるパッケージを作る
pipコマンドとは、Python公式のパッケージ管理システムのことで、Pip Installs Packages(またはPython)の略です。
Pythonに公式に登録されたパッケージのインストールやアンインストールができるコマンドになります。(参照元)
先ほどのimportの項目で「Module Not Found Error」というエラーに遭ったと思うのですが、その注意書のところをよく見ると、

「If your import is failing due to a missing package,
(もしパッケージが見つからなくてインポートに失敗してるなら)
you can manually install dependencies using either !pip or !apt.」
(!pipか!aptのどちらかを使って手動でインストールすることもできるよ)
と書いてあります。(Yuuui翻訳/間違ってたらすみません)
が、今回作成した「BMI測定プログラム」はパッケージ化されていないので!pipコマンドではインストールすることができません。
困りましたね。
というわけでこれから、「BMI測定プログラム」をパッケージ化する作業を行います!
<必要なファイル構成を確認>
パッケージ化するにあたって必要なファイル構成はこちら。
├── BMIapp │ ├── __init__.py │ ├── bmi.py │ └── setup.py
「BMIapp」というディレクトリの中に「__init__.py」と「bmi.py」というファイルがあり、その下に「setup.py」というファイルがあります。
この形になるように作成していきましょう。
<作成手順>
①まず、「BMIapp」というディレクトリ(フォルダ)を作成し、先ほど作った「bmi.py」をこちらに移動させます。
※正確にはディレクトリとフォルダは異なりますが、初心者の方にもわかりやすくするために(フォルダ)としています。

▼BMIappにbmi.pyを移動したことで、先ほどパスを通した場所にbmi.pyがいなくなったので再度パスを通しなおします。

②__init__.pyを作成します。
こちらのファイルも「BMIapp」ディレクトリの中に作成し、以下のコードを入力して保存します。
from .bmi import bmi_calc
▼新しいディレクトリ(フォルダ)やファイルは既存データの右側をクリックすることで作成できます。

こちらのファイルを作成しておくことでimportしたあとにモジュールを呼び出すのが簡単になる、とのことです。
細かい役割などの話をすると非常に多くの使い方があり難しい内容になってしまうので触れませんが、気になる〜という方はPython公式チュートリアルにて解説していますのでご覧ください。
③setup.pyを作成します。
このファイルは「BMIapp」をパッケージとして認識させるためのものです。
こちらは「BMIapp」の下に作成する必要があるため、今回は特定のディレクトリ内には置かずそのまま置きます。
そして以下のコードを記述します。
import setuptools
setuptools.setup(
name=”BMIapp”,
version=”0.1″,
author=”TKREL”,
description=”BMI calculation APP”,
url=”https://blog.tkrel.com/”,
packages=setuptools.find_packages(),
classifiers=[
“Programming Language :: Python :: 3.6.9”,
“License :: OSI Approved :: MIT License”,
“Operating System :: OS Independent”,
]
)
この「setup.py」はpipに対して「モジュールですよ〜」と認識させてあげるためのもので、中身は「メタ情報」になります。
メタ情報とは「データのためのデータ」なのですが、データがゲシュタルト崩壊するので例を出しますと、みなさんに馴染みある「Excel」でいうなら、「作成者」や「作成日時」などが挙げられます。実際に上記コードを見ると、
・name=”BMIapp”
・author=”TKREL”
・“Programming Language :: Python :: 3.6.9”
などの情報が入っていますよね。これのことです。
こちらも作成できたら保存します。
・・・はい。ここまで大丈夫でしょうか?
無事、最初に確認した通りにディレクトリの作成およびファイルの配置ができました。
▼最初に確認した目標構成図
├── BMIapp │ ├── __init__.py │ ├── bmi.py │ └── setup.py
▼実際のディレクトリ構成

pipにBMIappをインストールする
さて、やっと…!インストール可能なパッケージを自作できたのでpipにBMIappをインストールしてみましょう!
新しいセルを作成して、下記のコマンドを実行してpip経由でパッケージをGoogle Colabにインストールします。
!python setup.py install
▼いよいよ・・・約束の刻、、、(?)

さあ・・・
どうなるか・・・


で、、、、、、、、、、、、、、、
できた〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
完・全・勝・利!!!!!!!!(艦これのBGM)
お酒持ってきて!!!!!!!!!!!!!!!
😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂
(少々お待ちください)
・
・
・
・
・
・
・
・
・
・
取り乱してすみません。
気を取り直して続きです。
あと少しですのでもうちょっと頑張っていきましょう。
問題なくインストールできると、下記のようなログが表示されます。
running install
running bdist_egg
running egg_info
creating BMIapp.egg-info
writing BMIapp.egg-info/PKG-INFO
writing dependency_links to BMIapp.egg-info/dependency_links.txt
writing top-level names to BMIapp.egg-info/top_level.txt
writing manifest file ‘BMIapp.egg-info/SOURCES.txt’
reading manifest file ‘BMIapp.egg-info/SOURCES.txt’
writing manifest file ‘BMIapp.egg-info/SOURCES.txt’
installing library code to build/bdist.linux-x86_64/egg
running install_lib
warning: install_lib: ‘build/lib’ does not exist — no Python modules to install
creating build
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/EGG-INFO
copying BMIapp.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying BMIapp.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying BMIapp.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying BMIapp.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents…
creating dist
creating ‘dist/BMIapp-0.1-py3.6.egg’ and adding ‘build/bdist.linux-x86_64/egg’ to it
removing ‘build/bdist.linux-x86_64/egg’ (and everything under it)
Processing BMIapp-0.1-py3.6.egg
Copying BMIapp-0.1-py3.6.egg to /usr/local/lib/python3.6/dist-packages
Adding BMIapp 0.1 to easy-install.pth file
Installed /usr/local/lib/python3.6/dist-packages/BMIapp-0.1-py3.6.egg
Processing dependencies for BMIapp==0.1
Finished processing dependencies for BMIapp==0.1
最後の行にある
「Finished processing dependencies for BMIapp==0.1」
まで確認できたら、「pip list」コマンドを使ってインストール済みパッケージ一覧を表示させ、BMIappがきちんとインストールされているかを確認しましょう!
▼「!pip list」と入力して実行します

ありました〜〜〜〜〜〜!やったね〜〜〜成功です!!!!
そして最後の仕上げ。
正常にインストールされていることが確認できたら、利用できるかを確認しましょう。
最後まで抜かりなく仕事するのがデキる女というものです😌
※ツクレルさんの教材がデキるだけ
新しくセルを作成して以下のコードを
from BMIapp import bmi
bmi.bmi_calc(60,165)
▼実行〜〜〜!(IKKOさん風に)

・
・
・
▼はい!よし!無事に動作していますね!ありがとうございます!(謎のお礼)

はい、以上で今回の勉強会のゴール
PythonでBMIを計測するモジュールを作成して、ローカル環境にパッケージとしてインストールするのを体験しましょう。「作成したパッケージをインストールしよう」まで行うのが本日のゴールです。
を見事クリアしました!!!!!
書いている私すら途中で何度も挫折しかけましたが、ここまで投げ出さずに読んでくださったみなさま、まことにありがとうございます…!
お疲れ様でした!
今回のまとめ🍬
いや…本当に今回は真面目に難しかったです。。
あまりにも分からなすぎて「ブログやめようかな」とか思ったりもしたんですが(爆)、いや、有言実行や…!(謎の関西人)とひたすら自分に言い聞かせてガチで途中泣きながら進めました(笑)
結果、けっこうな時間が掛かっちゃったんですけれども、この記事を書き始めたときと今では全然見える景色が変わりました。
躓いた場所を調べに調べて自分で解決させられたときは、「やった〜!」って言って手を叩いて喜んじゃいましたしおすし。
小さな一歩かもしれませんが、何事もこういう地道な一歩を重ねることでしか成長はできないんだなと強く思いました。
諦めなくてよかった〜〜〜〜!
今日は赤飯ですねっ!(赤飯の豆は取り除く邪道派Yuuui)
——————————————–
●今回使用したツクレル教材情報●
・Pythonのモジュールを自作しよう
*ご利用には無料会員登録が必要です。
●今回(2020年9月18日(金))の放送●
Pythonで自作モジュールを作ろう!
※Youtubeに飛びます。
●次回(2020年9月25日(金))の放送予告●
ラズパイの初期設定から基本操作までを学べる勉強会
※上記URLからも参加申し込みできます!
●ツクレルさん情報●
公式サイト:https://blog.tkrel.com/
Youtubeチャンネル:https://www.youtube.com/channel/UCeB9_3IiJbcbOQIAV75nqyA
<勉強会の参加はこちらから!>
Doorkeeperコミュニティ:https://tsukurel.doorkeeper.jp/
<クリックで飛べます>
・facebookコミュニティ
・公式Twitter
————————————–
気に入っていただけたらぜひスキ!押してください〜!
ついでにフォローもしてってくれたらうれピコです😳
☆Follow me!
Twitter @yuuui202008
Facebook Yui Utauyo
★Check it Out! Subscribe!
仮歌singerが歌う「歌ってみた」動画
Youtube https://www.youtube.com/channel/UCwEZ5YUe-JWKdj_Wal-0-bw