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
[広告]