はじめに
Pythonの軽量管理ツールのuvでPyPIにパブリッシュするのはかなり簡単なんですけど、すぐ忘れるので記事にします。
そもそもuvとはという方はリンク先参照。
この記事でできること
- uvでTestPyPIにパブリッシュする方法が分かる
- uvでPyPIにパブリッシュする方法が分かる
この記事の対象者
- Pythonでuvを使用している人
- PyPIにライブラリをパブリッシュしたい人
動作環境・使用するツールや言語
- Windows11
- uv 0.6.6
ビルドするまで
実装
実装自体は完了しているものとします。
src/your-package/main.pyとかになっているのが良さそうです。
pyproject.tomlの見直し
uvはpyproject.tomlを元に色々やってくれます。ビルドする前に確認と修正をしておきましょう。
今回ライブラリを作成したのでそれを元に説明します。
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "enveil"
version = "1.0.0"
description = "A secure, cross-platform tool to gather system environment information (hardware, OS, software)."
authors = [{name = "name", email = "mail@users.noreply.github.com"}]
license = { file = "LICENSE" }
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Topic :: System :: Systems Administration",
"Topic :: Utilities",
]
keywords = ["environment", "system", "information", "hardware", "os", "software", "cli"]
dependencies = []
[project.urls]
Homepage = "https://github.com/FlatBone/Enveil"
Issues = "https://github.com/FlatBone/Enveil/issues"
[project.scripts]
enveil = "enveil.main:main"
[tool.setuptools.packages.find]
where = ["src"]
[tool.pytest.ini_options]
markers = [
"integration: marks tests as integration tests",
]
解説は以下です。
# パッケージのビルド方法を定義する、必須のセクションです。
# uvやpipがこの情報を見て、パッケージを正しくビルドします。
[build-system]
# パッケージのビルドに必要なライブラリを指定します。
# setuptoolsは最も一般的なビルドバックエンドの一つです。wheelはビルド形式です。
requires = ["setuptools>=61.0"]
# 実際にビルド処理を行うPythonオブジェクトを指定します。
build-backend = "setuptools.build_meta"
# パッケージのメタデータ(基本情報)を定義する中心的なセクションです。
# PyPIに表示される情報の多くは、ここで定義されます。
[project]
# PyPI上で一意となるパッケージ名。'pip install your-package' のように使われます。
# ハイフン(-)区切りが一般的です。
name = "your-package"
# パッケージのバージョン。最初は "0.1.0" から始めることが多いです。
version = "0.1.0"
# パッケージの作者。複数人いる場合はカンマで区切って追記できます。
# emailは、GitHubで提供されるnoreplyアドレスを使うとプライバシーが保護されやすいです。
authors = [
{ name = "your-name", email = "your-name@users.noreply.github.com" },
]
# パッケージの短い説明。PyPIの検索結果一覧などで表示されます。
description = "A short description of your package."
# READMEファイルへのパス。このファイルの内容がPyPIのプロジェクトページに表示されます。
# Markdown形式が一般的です。
readme = "README.md"
# このパッケージが動作するために必要なPythonのバージョンを指定します。
# ">=3.8" は「Python 3.8以上」を意味します。
requires-python = ">=3.8"
# パッケージのライセンス。プロジェクトルートにあるLICENSEファイル名を指定するのが一般的です。
# または、 license = { text = "MIT" } のように直接ライセンス名を指定することもできます。
license = { file = "LICENSE" }
# PyPIでパッケージを検索しやすくするためのキーワード。
keywords = ["system", "information", "tool"]
# PyPIでパッケージを分類するための識別子。
# パッケージの成熟度、対象読者、対応するPythonバージョンなどを明示できます。
# 一覧: https://pypi.org/classifiers/
classifiers = [
"Development Status :: 3 - Alpha", # 開発状況 (Alpha, Beta, Production/Stableなど)
"Intended Audience :: Developers", # 対象読者
"License :: OSI Approved :: MIT License", # ライセンス
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
]
# このパッケージが依存する他のライブラリ。
# 'pip install' した際に、ここに書かれたライブラリも一緒にインストールされます。
# バージョンを指定することも可能です (例: "requests>=2.20.0")。
dependencies = [
"requests",
"numpy>=1.20.0",
]
# PyPIのプロジェクトページに表示される追加のリンク。
[project.urls]
Homepage = "https://github.com/your-name/your-package"
Repository = "https://github.com/your-name/your-package" # ソースコードの場所
"Bug Tracker" = "https://github.com/your-name/your-package/issues" # バグ報告用のURL
# このパッケージをインストールした際に、コマンドラインから実行できるスクリプトを定義します。
# "コマンド名 = "パッケージ名.モジュール名:関数名"" の形式で書きます。
# この設定により、'your-package' というコマンドがターミナルで使えるようになります。
[project.scripts]
your-package = "your_package.main:main" # パッケージ名はハイフンではなくアンダースコアを使うのが一般的
# -------------------------------------------------------------------
# ここからは、ビルドや開発ツールに関する設定です (tool.* セクション)
# -------------------------------------------------------------------
# setuptools (ビルドツール) の設定
[tool.setuptools.packages.find]
# パッケージとして含めるソースコードがどこにあるかを指定します。
# "src" ディレクトリ配下にソースコードを置く 'src-layout' という構成でよく使われる設定です。
where = ["src"]
# pytest (テストツール) の設定。パッケージング自体には必須ではありません。
[tool.pytest.ini_options]
# pytestでカスタムマーカーを使う際、ここに登録しておくと警告が出なくなります。
# (例: @pytest.mark.integration のようにテストに目印を付ける機能)
markers = [
"integration: marks tests as integration tests",
]
uvでビルド
プロジェクトのルート(pyproject.tomlがある階層) で下記ビルドコマンドを実行します。
uv build
実行後、distフォルダ内にyour-package.whlとyour-package.gzができればOKです。
TestPyPI
TestPyPIは本番であるPyPIに公開する前に試せる場所です。不安な場合は一度こちらにパブリッシュするのが良いのでやっておきましょう。
TestPyPIのユーザー登録
ユーザー登録が必要です。
二段階認証アプリの登録が必要です。
PyPIとは別のアカウントになります。
APIトークン取得
登録ができたら、右上の設定→アカウント設定と進んでAPIトークンの追加/発行をします。
環境変数に登録
ユーザー環境変数にTEST_PYPI_TOKENとして先ほどコピーしたトークンを貼り付けて登録します。

TestPyPIにパブリッシュ
下記コマンドでTestPyPIにパブリッシュできます。
uv publish --publish-url https://test.pypi.org/legacy/ --token $TEST_PYPI_TOKEN
テストする
適当な無関係のフォルダを作成してpip installして試してみましょう。
# 関係ないフォルダに移動後
uv init
uv venv
uv pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ your-package
uv run your-packageコマンドや、仮想環境をactivateして直接起動してみたりして挙動を確かめましょう。
PyPIに本番リリース
特に問題なさそうなら本番をリリースします。
PyPIのユーザー登録
こちらもユーザー登録が必要です。
二段階認証アプリの登録が必要です。
TestPyPIとは別のアカウントになります。
APIトークン取得
登録ができたら、右上の設定→アカウント設定と進んでAPIトークンの追加/発行をします。
環境変数に登録
再度、ユーザー環境変数にPYPI_TOKENとして先ほどコピーしたトークンを貼り付けて登録します。

PyPIにパブリッシュ
プロジェクトのルートでパブリッシュコマンドを実行します。
uv publish --token=$PYPI_TOKEN
これで問題なければPyPIにパブリッシュされ、世界中からpipコマンドでインストールできるようになります。
PyPIでの表示ページは下記のURLになります。
https://pypi.org/project/your-package/
補足
今回、私が作った環境取得用ライブラリも置いておきます。
他の人や生成AIに環境を伝えるために各種CPU、GPU、プログラミング言語のバージョンが一発で取得できます。(Windows意外だと動作不安定気味)
# インストール
pip install enveil
# 実行
enveil
# 実行結果
{
"hardware": {
"CPU": "13th Gen Intel(R) Core(TM) i5-13400F",
"RAM": "32.0GB",
"GPU": "NVIDIA GeForce RTX 5070 (11.9GB)"
},
"os": {
"Build": "26100",
"OS": "Microsoft Windows 11 Home",
"Architecture": "64-bit",
"Version": "10.0.26100"
},
"software": {
"Python": "Python 3.13.2",
"uv": "uv 0.6.6 (c1a0bb85e 2025-03-12)",
}
}
公開完了:pip installする
無事に完了すれば、公開されています。
これでPythonやuvからpip installすることで使えるようになりました。
pip install your-package
#または
uv pip install your-package
参考資料
おわりに
自分用のツールだったとしても、どのPCからでも名前だけでインストールできると意外と役に立つことが多いです。
気軽にPyPIにパブリッシュしても良いのではないのでしょうか?
こういうしょうもないライブラリ も公開しているので使ってみてください。
ダウンロード数は pepy.techというサイトで確認できます。モチベーションアップになるかも。

