Python ローカル環境でインストール可能なパッケージを作成する

PyPI再デビューにあたり、まずはローカル環境でインストールできるパッケージを作成することにします。
手持ちの本を調べてみた所、『テスト駆動形Python』の付録にそれらしき記述がありました。

この本はpytestによるテスト駆動形開発手法の解説書なんですが、思わぬところで役に立ってくれました。

コード作成

以下のようなディレクトリ構成でファイルを作成します。
ux68k_proj/
├── setup.py # インストールするための設定
└── ux68k.py # モジュール本体

■ux68k.py

def hello():
    print('Hello, Ubuntu!')

■setup.py

from setuptools import setup

setup(
    name='ux68k',
    py_modules=['ux68k']
)

インストール

それでは、pipインストールしてみます。
プロジェクトのルートディレクトリに移動し、

$ cd ux68k_proj

pip installコマンドを実行します。

$ pip install .

ちゃんとインストールされたかチェック。

$ pip list
Package    Version
---------- -------
pip        19.3.1 
setuptools 41.2.0 
ux68k      0.0.0

インストールは成功したみたいです。

対話モードで実行してみます。

>>>  from ux68k import hello
>>>  hello()
Hello, Ubuntu!
>>> 

すべて上手くいったようです。

パッケージ名を変更してみる

ここまでの作業は、『テスト駆動Python』を写経しただけです。
ためしに、パッケージ名を変更できるか実験してみます。
おそらく、 setup.pyのsetup関数のnameオプション引数を変えればいいのではないかと思います。

その前に、実験がやりやすいように、今インストールしたux68kをアンインストールしておきます。

$ pip uninstall ux68k

setup.pyを修正します。
■setup.py※2

from setuptools import setup

setup(
    name='hoge',    # ux68k -> hoge
    py_modules=['ux68k']
)

インストール & 確認。

$ cd ux68k_proj
$ pip install .
$ pip list
Package    Version
---------- -------
hoge       0.0.0  
pip        19.3.1 
setuptools 41.2.0 

ここまでは順調。
hogeモジュールがちゃんと使えるか試してみます。

>>> import hoge
import hoge
Traceback (most recent call last):
  File "", line 1, in 
ModuleNotFoundError: No module named 'hoge'

あらら?
「hogeモジュールがない」って言われてしまいました。

念のため、ux68kをインポートしてみると、

$ import ux68k
$ ux68k.hello()
Hello, Ubuntu!

成功。
どうやら、setup関数のnameオプション引数はPyPIに登録したときのパッケージ名のようです。
つまり、※2のようにsetup.pyを記述すると、hogeパッケージのux68kモジュールが使えるようになるというわけですね(たぶん)。

モジュールを追加してみる

setup関数のpy_modulesオプション引数はリストで指定するので、複数のモジュールを登録できそうです。
ちょっくら実験してみます。
まずは、hogeをアンインストールして実験環境を整えます。

$ pip uninstall hoge

ux68k_projの下にlx68k.pyというPythonスクリプトファイルを作成します。

■lx68k.py

def hello():
    print('こんにちは、Ubuntu。')

setup.pyを修正します。

■setup.py

from setuptools import setup

setup(
    name='hoge2',    # hoge -> hoge2
    py_modules=['ux68k', 'lx68k'] # lx68kを追加
)

pipインストールします。

$ cd ux68k_proj
$ pip install .

対話モードPythonでモジュールがインポートできるかテストします。

>>> import ux68k
>>> import lx68k
>>> ux68k.hello()
Hello, Ubuntu!
>>> lx68k.hello()
こんにちは、Ubuntu。

どうやら、すべて上手くいっているようです。

しかし・・・
Pythonパッケージの名前空間の管理って、どうなってるんですかね(「今更ながら」ですが)。
誰かが作った別のパッケージでux68kやlx68kが使われていれば、衝突してしまうと思うんですが。

まあ、このあたりのことはPyPIに登録する段階になったら考えることにしましょう。

では、また明日。

追記

Pythonのパッケージ作成に関して実験しているサイトがありました。
Pythonパッケージ作りの初歩の初歩 その2

«戻る つづく»


[広告] テスト駆動Python