この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。
本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。
姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。
≫ 目次に戻る前回は説明のためのプログラムとコマンドでした。今回は実際に利用するプログラムとコマンドに変更します。
1from mod import loader, builder
2from mod.util import checker
3
4# このファイルのあるディレクトリをCWDとして実行する
5def main():
6 # 設定の読み込み
7 data = loader.load()
8
9 # EPUBデータの構築
10 builder.build(data)
11
12 # EPUBデータの確認(--epubcheck)
13 if data['epubcheck']:
14 checker.epubcheck(data) # epubcheckで検証
15
16main()
python -B main.py --config "C:\~\doc_md\config.yaml" --epubcheck
あるいは、相対パスで書きます。
python -B main.py --config "../doc/01_md/config.yaml" --epubcheck
コマンドにはpython
の直後に-B
のフラグを追加します。
ここから先、プログラムはモジュールという形で複数のファイルに分割します。-B
のフラグを付けないと、プログラム実行時にキャッシュ ファイルが自動で生成されます。-B
のフラグを付けると、キャッシュ ファイルを抑制できます。
さて、作成したmain.py
は、そのままでは実行するとエラーが発生します。
main.py
は冒頭で、from~import~
を使い、ローカルのファイルをモジュールとして読み込んでいます。モジュールというのはプログラムを分割して部品としてあつかうものです。
先ほどimport sys
として、Python標準ライブラリーのsys
を読み込みました。同じようにimport my_module
と書くと、現在のファイルと同じディレクトリーにあるmy_module.py
を読み込みます。読み込んだプログラムはmy_module
という名前で利用できます。
import my_module.py
ではなく、拡張子を除いたimport my_module
なので注意してください。
今回のようにfrom mod import loader, builder
と書くと、mod
ディレクトリーから、loader.py
とbuilder.py
を読み込むという意味になります。
from mod.util import checker
は、mod/util
ディレクトリーからchecker.py
を読み込むという意味になります。
現状、これらのファイルを用意していないのでエラーになります。それぞれ作成して、次のようにプログラムを書きます。
gen-epub/
main.py
mod/
loader.py
builder.py
util/
checker.py
1def load():
2 print('load')
3 data = {'epubcheck': True}
4 return data
1def build(data):
2 print('build')
1def epubcheck(data):
2 print('check')
そしてpython -B main.py --config "../doc/01_md/config.yaml" --epubcheck
のコマンドを実行します。すると次のように表示されます。
load
build
check
mod/loader.py
で出てくる'load'
や'epubcheck'
などはテキストです。'
(シングルクォート)や"
ダブルクォート)で囲った部分は、テキストというデータ型になります。プログラムの値として使える文字や文章です。
このloader.py
、builder.py
、checker.py
は、あとで実際に利用するプログラムに差し替えます。
今回は初回なので、仮のファイルを作って丁寧に説明しました。ただ、毎回このように書くと煩雑になります。
以降は、まだ作っていないファイルでも、仮のファイルを作らずにimport
で読み込むコードを書きます。未見のファイルをインポートしている時は、先のページで出てくると思ってください。
さて、少しmain.py
を解説します。そのために、もう一度同じコードを掲載します。
1from mod import loader, builder
2from mod.util import checker
3
4# このファイルのあるディレクトリをCWDとして実行する
5def main():
6 # 設定の読み込み
7 data = loader.load()
8
9 # EPUBデータの構築
10 builder.build(data)
11
12 # EPUBデータの確認(--epubcheck)
13 if data['epubcheck']:
14 checker.epubcheck(data) # epubcheckで検証
15
16main()
各行の#
の右側はコメントです。プログラムを実行するときに無視されます。コメントには、処理の説明や、処理のまとまりの見出しを書きます。
def main():
というのは関数の定義です。関数というのはプログラムの処理をひとまとまりにしたものです。
def main():
は「def
(define:定義する)」「main()
という関数」「:
のあとにインデントして関数の中身を書く」という意味です。
Pythonでは、処理のまとまりをインデントで表します。インデントは半角スペース4つでおこないます。
VSCodeでTab
キーを押すとインデントが入ります。インデントの階層を戻したいときはShift+Tab
を押します。
def main():
で定義した関数を使うときは、ファイルの末尾にあるようにmain()
と書いて利用します。そうすると、このmain()
関数のインデント部分の処理が実行されます。
関数というのはプログラムの命令です。多くの場合、引数という入力値を受け取り、処理をおこない、戻り値という出力値を返します。Pythonの関数の構造を示します。
def func(arg1, arg2, arg3):
res = arg1 + arg2 + arg3
return res
print(func(10, 20, 30))
# 「60」と出力される
上のようなプログラムを書くと、func()
関数が10
、20
、30
という引数を受け取り、内部処理として足し算をおこない、変数res
に値を代入し、return res
で変数res
の値を返します。
変数というのは、値を入れておく箱のようなものです。
=
は代入演算子というもので、記号の右側の計算結果を、左側の変数に入れます。こうした変数に値を入れることを代入と言います。
func(10, 20, 30)
と書いた場所には、この関数内の計算結果の60
が戻ります。そしてprint(func(10, 20, 30))
はprint(60)
になり、60
がターミナルに出力されます。
main.py
を見ていきましょう。data = loader.load()
は「loader.py
のload()
関数を実行して、その結果を変数data
に代入する」という処理です。
これから作成するloader.py
では、config.yaml
を読み込み、EPUB生成で使う設定を用意して返します。
次のbuilder.build(data)
は「builder.py
のbuild()
関数を、変数data
の値を引数にして実行する」という処理です。
これから作成するbuilder.py
では、loader.py
で作成した設定を利用して、実際にEPUBファイルを作成します。
最後はEPUB確認をおこなう処理です。
if data['epubcheck']:
はif
文と呼ばれるものです。
if
のあとのdata['epubcheck']
の中身がTrue
という値なら、:
のあとにインデントした部分の処理をおこないます。True
でないなら、:
のあとにインデントした部分の処理はおこないません。
この部分の実際の挙動は次の通りです。
--epubcheck
のフラグを付けた場合。--epubcheck
のフラグを付けなかった場合。 data['epubcheck']
の部分の説明もおこないます。
変数data
には辞書という形式のデータが入っています。辞書は「キーと値」がペアになったデータ型です。最終的なプログラムでは、次の表のようなデータが入っています。
キー | 値 |
---|---|
epubcheck |
True |
config |
読み込んだconfig.yaml の内容 |
dirs |
各種ディレクトリーのパス |
data['epubcheck']
のように書くと、辞書内のepubcheck
キーの値を取り出します。実際の処理ではTrue
かFalse
の値を入れています。
True
、False
というのは、真偽値と呼ばれるデータ型です。True
(真、正しい)あるいはFalse
(偽、正しくない)という2つの値のいずれかを取ります。
checker.epubcheck(data)
は「checker.py
のepubcheck()
関数を、変数data
の値を引数にして実行する」という処理です。ここでは、loader.py
で作成した設定を利用して、作成したEPUBファイルにエラーがないかを確認します。
今回は最初でしたので丁寧に書きました。プログラミング自体が不慣れな場合は、何らかの初心者向けのPython本で学習をおこなっておいた方がよいです。
この本では、プログラム中に出てきた処理の説明を中心におこないます。
この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。
本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。
姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。