Pythonのパッケージを作る方法 簡単な手順

# はじめに
pythonのパッケージを作る方法を整理します。

# 1 プロジェクトフォルダとファイルの作成

下記のようにファイル構造を作成する。
パッケージの名称を companypackageとします。

```text:プロジェクトのフォルダ構造

packaging_example/
└── src/
    └── companypackage/
        ├── __init__.py
        └── example.py

```

example.pyに下記のような簡単なプログラムを入れておきます。

```python:examplepy
def add_one(number):
    return number + 1
```

# 2 パッケージファイルを作成する

プロジェクトの構造はこのようにアップデートされます。

```text:プロジェクトのフォルダ構造

packaging_example/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
　   └── companypackage/
       ├── __init__.py
       └── example.py

```

#2.1 pyproject.tomlを作成する

```python: pyproject.toml
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "companypackage"
version = "0.0.1"
authors = [
  { name="Example Author", email="author@example.com" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]

[project.urls]
"Homepage" = "https://github.com/pypa/sampleproject"
"Bug Tracker" = "https://github.com/pypa/sampleproject/issues"

```

#2.2 README.mdを作成する

```md:README.md
# Example Package

This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

```
#2.3 LICENSEファイルを作成する

```text:LICENSE
Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

# 3 パッケージファイルを生成する。

buildパッケージをpipでインストールします。
```
pip install build
```
ターミナルで下記の命令語を入力します。
```
pyton -m build
```
下記のようなパッケージファイルが /distフォルダに生成されます。
```
dist/
├── companypackage-0.0.1-py3-none-any.whl
└── companypackage-0.0.1.tar.gz
```

# 4 パッケージファイルをtestpypiにアップロードする。

pypiではなく、まずtestpypiにアップロードする方法を説明します。
基本的な方法はこちらで確認してください。
https://test.pypi.org/

twineパッケージをpipでインストールします。
```
pip install twine
```

ターミナルで下記の命令語を入力します。
```
twine upload --repository testpypi dist/*
```

```
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: __token__
Uploading companypackage-0.0.1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.2/8.2 kB • 00:01 • ?
Uploading companypackage-0.0.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.8/6.8 kB • 00:00 • ?
```
パッケージをアップロードしたら、 TestPyPI 上で閲覧できるようになります; 
例えば: https://test.pypi.org/project/example_package_YOUR_USERNAME_HERE 。

# 5 自分のパッケージをインストールする。

下記のようなパッケージページが形成されますので、その指示に従ってインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/08ece35a-9aae-8b8b-86ae-46e2e9b27815.png)

インストールの例
```
pip install -i https://test.pypi.org/simple/ comcomtest
```
# 5.1 自分のパッケージをチェックする。

```python
from companypackage import example

print(example.add_one(2))

3
```

# 6 パッケージファイルをpypiにアップロードする。

本番のpypiにアップロードする方法を説明します。
testpypiと同様に自分のidにログインし、API Tokenを確保しておいてください。

ターミナルで下記の命令語を入力します。
```
twine upload --repository pypi dist/*
```


#参考資料
https://packaging.python.org/en/latest/tutorials/packaging-projects/

https://widdowquinn.github.io/coding/update-pypi-package/

https://blog.amedama.jp/entry/2017/12/31/175036