PythonでMarkdownからEPUBをつくろう

この連載について

 この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。

 本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。

 姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。

目次に戻る

4-2 プログラムの準備2

公開:2025-05-21

 前回は説明のためのプログラムとコマンドでした。今回は実際に利用するプログラムとコマンドに変更します。

▶ 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()
▶ 実行コマンド
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.pybuilder.pyを読み込むという意味になります。

 from mod.util import checkerは、mod/utilディレクトリーからchecker.pyを読み込むという意味になります。

 現状、これらのファイルを用意していないのでエラーになります。それぞれ作成して、次のようにプログラムを書きます。

▶ ファイル構成
▶ mod/loader.py
1def load():
2    print('load')
3    data = {'epubcheck': True}
4    return data
▶ mod/builder.py
1def build(data):
2    print('build')
▶ mod/util/checker.py
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.pybuilder.pychecker.pyは、あとで実際に利用するプログラムに差し替えます。

 今回は初回なので、仮のファイルを作って丁寧に説明しました。ただ、毎回このように書くと煩雑になります。

 以降は、まだ作っていないファイルでも、仮のファイルを作らずにimportで読み込むコードを書きます。未見のファイルをインポートしている時は、先のページで出てくると思ってください。

 さて、少しmain.pyを解説します。そのために、もう一度同じコードを掲載します。

▶ 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()関数が102030という引数を受け取り、内部処理として足し算をおこない、変数resに値を代入し、return resで変数resの値を返します。

 変数というのは、値を入れておく箱のようなものです。

 =は代入演算子というもので、記号の右側の計算結果を、左側の変数に入れます。こうした変数に値を入れることを代入と言います。

 func(10, 20, 30)と書いた場所には、この関数内の計算結果の60が戻ります。そしてprint(func(10, 20, 30))print(60)になり、60がターミナルに出力されます。

 main.pyを見ていきましょう。data = loader.load()は「loader.pyload()関数を実行して、その結果を変数dataに代入する」という処理です。

 これから作成するloader.pyでは、config.yamlを読み込み、EPUB生成で使う設定を用意して返します。

 次のbuilder.build(data)は「builder.pybuild()関数を、変数dataの値を引数にして実行する」という処理です。

 これから作成するbuilder.pyでは、loader.pyで作成した設定を利用して、実際にEPUBファイルを作成します。

 最後はEPUB確認をおこなう処理です。

 if data['epubcheck']:if文と呼ばれるものです。

 ifのあとのdata['epubcheck']の中身がTrueという値なら、:のあとにインデントした部分の処理をおこないます。Trueでないなら、:のあとにインデントした部分の処理はおこないません。

 この部分の実際の挙動は次の通りです。

 data['epubcheck']の部分の説明もおこないます。

 変数dataには辞書という形式のデータが入っています。辞書は「キーと値」がペアになったデータ型です。最終的なプログラムでは、次の表のようなデータが入っています。

▶ 辞書dataの内容
キー
epubcheck True
config 読み込んだconfig.yamlの内容
dirs 各種ディレクトリーのパス

 data['epubcheck']のように書くと、辞書内のepubcheckキーの値を取り出します。実際の処理ではTrueFalseの値を入れています。

 TrueFalseというのは、真偽値と呼ばれるデータ型です。True(真、正しい)あるいはFalse(偽、正しくない)という2つの値のいずれかを取ります。

 checker.epubcheck(data)は「checker.pyepubcheck()関数を、変数dataの値を引数にして実行する」という処理です。ここでは、loader.pyで作成した設定を利用して、作成したEPUBファイルにエラーがないかを確認します。

 今回は最初でしたので丁寧に書きました。プログラミング自体が不慣れな場合は、何らかの初心者向けのPython本で学習をおこなっておいた方がよいです。

 この本では、プログラム中に出てきた処理の説明を中心におこないます。


目次に戻る

この連載について

 この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。

 本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。

 姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。

 技術系同人誌など まとめページ


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2025 Cronus Crown (c)1997-2025 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について