【Python】egg / wheel ファイルを作成する

■ はじめに

https://dk521123.hatenablog.com/entry/2019/11/09/001342

で触れた egg / wheel について、
実際に Hello world的なことをやる。

後日談

当初は、EGGファイルだけの記事だけだったが

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/add-job-python.html

でみたら、
EGGファイル(.egg)とWheelファイル(.whl)の作成の違いは、コマンド
~~~~
python setup.py bdist_egg

python setup.py bdist_wheel
~~~~
だけだったので、記事を更新する。

目次

【1】環境例
【2】環境構築
【3】egg / wheel 作成手順
【4】egg / wheelファイルを使うには

【1】環境例

* OS : Windows10
* anaconda : version 1.7.2
* Python : Python 3.7.4
* 開発環境 : VS Code v1.42.0

以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2019/10/24/000000

【2】環境構築

1)pip のインストール
2)仮想環境構築ツール virtualenv のインストール
3)テンプレート生成ツールpasterのインストール

1)pip のインストール

python -m pip install --upgrade pip --user

2)仮想環境構築ツール virtualenv のインストール

pip install virtualenv

3)テンプレート生成ツールpasterのインストール

pip install PasteScript

# 使用可能な雛型を確認
paster create --list-template
===
Available templates:
  basic_package:  A basic setuptools-enabled package
  paste_deploy:   A web application deployed through paste.deploy
===

【3】egg / wheel 作成手順

1)仮想環境構築の作成
2)パッケージの作成
3)ソースを書く
4)egg / wheel ファイルの作成
5)後処理

※ 一度、行えば、3)⇒4)だけでいい。

1)仮想環境構築の作成

# フォルダ「work」を作成
mkdir work
cd work

# 仮想環境作成
virtualenv --no-site-packages demoenv
# 特定のバージョン時
# virtualenv -p python3.6 demoenv

# 仮想環境構築に入る(アクティベーション)
demoenv\Scripts\activate.bat

# Linuxの場合
# source demo-env/bin/activate

2)パッケージの作成

cd demoenv

# paster create -t basic_package [パッケージ名]
paster create -t basic_package DemoLib

[出力]
Variables:
  egg:      DemoLib
  package:  demolib
  project:  DemoLib
Enter version (Version (like 0.1)) ['']:【バージョン入力(今回は1.0)】
Enter description (One-line description of the package) ['']:【概要文入力(今回はThis is a Demo)】
Enter long_description (Multi-line description (in reST)) ['']: 【説明文入力(今回はThis is a Demo for egg)】
Enter keywords (Space-separated keywords/tags) ['']: 【キーワード入力(今回はDemo egg)】
Enter author (Author name) ['']: 【筆者入力(今回はYour-Name)】
Enter author_email (Author email) ['']:【Email入力(今回はyour@address.com)】
Enter url (URL of homepage) ['']: 【Web入力(今回はhttps://dk521123.hatenablog.com)】
Enter license_name (License name) ['']: 【ライセンス入力(今回はMIT)】
Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]:【ZIP化するか入力(今回はTrue)】
Creating template basic_package
Creating directory .\DemoLib
  Recursing into +package+
    Creating .\DemoLib\demolib/
指定されたパスが見つかりません。
    Copying __init__.py to .\DemoLib\demolib\__init__.py
指定されたパスが見つかりません。
    Recursing into __pycache__
      Creating .\DemoLib\demolib\__pycache__/
指定されたパスが見つかりません。
  Copying setup.cfg to .\DemoLib\setup.cfg
指定されたパスが見つかりません。
  Copying setup.py_tmpl to .\DemoLib\setup.py
指定されたパスが見つかりません。
Running c:\programdata\anaconda3\python.exe setup.py egg_info

自動生成されるファイル(.\work\demoenv\DemoLib\setup.py)

from setuptools import setup, find_packages
import sys, os

version = '1.0'

setup(name='DemoLib',
      version=version,
      description="This is a Demo",
      long_description="""\
This is a Demo for egg""",
      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
      keywords='Demo egg',
      author='Your-Name',
      author_email='your@address.com',
      url='https://dk521123.hatenablog.com',
      license='MIT',
      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
      include_package_data=True,
      zip_safe=True,
      install_requires=[
          # -*- Extra requirements: -*-
      ],
      entry_points="""
      # -*- Entry points: -*-
      """,
      )

自動生成されるファイル (.\work\demoenv\DemoLib\setup.cfg)

[egg_info]
tag_build = dev
tag_svn_revision = true

3)ソースを書く

.\work\demoenv\DemoLib\demolib\demo_lib.py

def say_hello(name):
  return "Hello, {}.".format(name)

4)egg / wheel ファイルの作成

eggファイル作成の場合

# python setup.py [コマンド]
# bdist_egg : egg 形式で生成
~~~~
python setup.py bdist_egg
~~~~
=> dist配下に「DemoLib-1.0.dev0-py3.7.egg」ができている

wheelファイル作成の場合

# bdist_wheel : wheel 形式で生成
~~~~
python setup.py bdist_wheel
~~~~
=> dist配下に「DemoLib-1.0.dev0-py3-none-any.whl」ができている

補足1:eggファイルの簡易確認方法

1) 「DemoLib-1.0.dev0-py3.7.egg」の拡張子を「.zip (DemoLib-1.0.dev0-py3.7.zip)」に変更
2) zipを解凍し、自分が作成したパッケージがあるかどうか確認する

■ 例
+ DemoLib-1.0.dev0-py3.7
 + demolib <= これあればOK
     + demo_lib.py
     + ...
 + EGG-INFO

補足2:eggファイル名について

■ ファイル例
DemoLib-1.0.dev0-py3.7.egg

■ ファイル名のフォーマット
【ライブラリ名(DemoLib)】-【ライブラリVersion(1.0)】【setup.cfg(.dev0)】-py【Python Version(3.7)】.egg

- ライブラリ名(DemoLib) : setup.pyの name

- ライブラリVersion(1.0) : setup.pyの version

- setup.cfg(.dev0) : setup.cfg の tag_build(tag_build = dev)
 ※ setup.cfg を削除すれば「.dev0」がなくなる

- Python Version(3.7) : 使用したPython version
 (変更したい場合は、Pythonの仮想環境 virtualenv などを利用し、変更する)

5)後処理

# 仮想環境終了(通常状態に復帰)
deactivate

【4】egg / wheelファイルを使うには

1)仮想環境作成
2)自作egg / wheelファイルのインストール
3)プログラムを作成&実行

1)仮想環境作成

# 仮想環境作成
virtualenv --no-site-packages democlient

# 仮想環境構築に入る(アクティベーション)
cd demoenv

2)自作egg / wheelファイルのインストール

easy_install ..\DemoLib\dist\DemoLib-1.0.dev0-py3.7.egg

Processing DemoLib-1.0.dev0-py3.7.egg
creating c:\programdata\anaconda3\lib\site-packages\DemoLib-1.0.dev0-py3.7.egg
Extracting DemoLib-1.0.dev0-py3.7.egg to c:\programdata\anaconda3\lib\site-packages
Adding DemoLib 1.0.dev0 to easy-install.pth file

Installed c:\programdata\anaconda3\lib\site-packages\demolib-1.0.dev0-py3.7.egg
Processing dependencies for DemoLib==1.0.dev0
Finished processing dependencies for DemoLib==1.0.dev0

3)プログラムを作成&実行

main.py

from demolib.demo_lib import *

if __name__=='__main__':
  result = say_hello('Mike')
  print('Result = {}'.format(result))

出力結果

Result = Hello, Mike.

参考文献

egg作成
https://www.exsoft.net/blog/entry/ab4v5g.html
virtualenv
https://hibiki-press.tech/learn_prog/python/virtualenv/4545
setupコマンド
https://qiita.com/JhonnyBravo/items/b8bae2578f07f31e4de7

関連記事

パッケージ管理 ~ pip / conda / wheel / egg ~
https://dk521123.hatenablog.com/entry/2019/11/09/001342
pip に関するあれこれ
https://dk521123.hatenablog.com/entry/2021/07/02/000000
オフライン環境下で pip install するには
https://dk521123.hatenablog.com/entry/2021/07/10/164833
Visual Studio CodePython拡張 ~
https://dk521123.hatenablog.com/entry/2019/10/24/000000