この記事では、MarkdownをPDFに変換するPython製ツール md2pdf_advanced を例に、PyPI (Python Package Index) にパッケージを公開するまでの手順を紹介します。
🎯 対象読者
- 自作のPythonライブラリやCLIツールを配布したい人
- StreamlitなどでGUI付きツールも含めて配布したい人
-
twineやpyproject.tomlを使ったモダンな公開フローを知りたい人
📁 1. ディレクトリ構成を整える
md2pdf_advanced/
├── md2pdf_advanced/
│ ├── __init__.py
│ ├── converter.py
│ ├── cli.py
│ ├── gui.py
│ └── styles/
│ ├── default.css
│ ├── zenn.css
│ └── github.css
├── example.md
├── README.md
├── requirements.txt
└── pyproject.toml
🛠 2. pyproject.toml を用意
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "md2pdf_advanced"
version = "0.1.0"
description = "Convert Markdown to PDF via CLI and GUI (with optional AI summary)"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "MIT"}
authors = [{ name = "Your Name", email = "your@email.com" }]
dependencies = [
"markdown",
"weasyprint>=60.0",
"jinja2",
"typer[all]",
"streamlit"
]
[project.scripts]
md2pdf = "md2pdf_advanced.cli:app"
🧪 3. 動作確認(CLI & GUI)
# CLI
python -m md2pdf_advanced.cli convert example.md --style zenn
# GUI(Streamlit)
PYTHONPATH=. streamlit run md2pdf_advanced/gui.py
🔐 4. PyPI アカウントと API トークンの取得
- PyPI に登録
-
API Token 発行
- トークン名例:
md2pdf-advanced-token - 生成される
pypi-...トークンを控える
- トークン名例:
📦 5. パッケージのビルド
pip install build twine
python -m build
dist/ ディレクトリに .whl と .tar.gz ができていればOK!
🚀 6. PyPI へアップロード
twine upload dist/*
- ユーザー名:
__token__ - パスワード:
pypi-...(APIトークン)
❗エラー "403 Forbidden" が出た場合は、パッケージ名の重複を疑おう
💡 7. よくあるエラー
| エラー内容 | 原因 | 対策 |
|---|---|---|
| 403 Forbidden | すでに他人が登録しているパッケージ名 | パッケージ名を変更する(例: md2pdf_advanced) |
| 相対import失敗 |
python 実行時の構造問題 |
python -m パッケージ名.モジュール名 形式で実行 |
| Streamlit GUIが動かない |
python で GUI を起動 |
streamlit run gui.py を使う |
✅ 8. 公開後の確認
pip install md2pdf_advanced
md2pdf convert example.md --style github
📝 まとめ
- モダンな Python パッケージは
pyproject.tomlベースで管理するのが主流 - GUIアプリも Streamlit を使えば配布可能
- 公開時は PyPI に未登録の名前 を選ぶことが重要