easy_installにsetup.pyでカスタムコマンドを実行させる方法は?
-
22-07-2019 - |
質問
Pythonパッケージのインストール(init.dスクリプトのインストール、ディレクトリとファイルの作成など)以外に、setup.pyにカスタムアクションを実行させたい。distutils/ setuptoolsクラスをカスタマイズして、独自のアクション。私が抱えている問題は、パッケージディレクトリにcdして「python setup.py install」を実行するとすべてが機能するが、「easy_install mypackage.tar.gz」を実行するとカスタムクラスが実行されないように見えることです。 。これが私のsetup.pyファイルです(同じディレクトリに空のmyfoobar.pyファイルを作成してテストします):
import setuptools
from setuptools.command import install as _install
class install(_install.install):
def initialize_options(self):
_install.install.initialize_options(self)
def finalize_options(self):
_install.install.finalize_options(self)
def run(self):
# Why is this never executed when tarball installed with easy_install?
# It does work with: python setup.py install
import pdb;pdb.set_trace()
_install.install.run(self)
setuptools.setup(
name = 'myfoobar',
version = '0.1',
platforms = ['any'],
description = 'Test package',
author = 'Someone',
py_modules = ['myfoobar'],
cmdclass = {'install': install},
)
" setup"をインポートしても同じことが起こります。および「インストール」 distutilsから。 easy_installにカスタムクラスを実行させる方法はありますか?
明確にするために、BuildoutやPaverなど、余分なものは使いたくありません。
解決
それはできません。 Enthoughtには、これをサポートするsetuptoolsのカスタムバージョンがありますが、そうでない場合は、6月から議論されているウィッシュリストアイテムとしてバグトラッカーにあります。
ただし、システムをtrickす方法があり、それらを検討するかもしれません。 1つの方法は、パッケージを使用するときに常に最初にインポートされる最も重要なモジュールを使用して、最初に呼び出されたときにインストール後のアクションを実行することです。その後、自分でクリーンアップする必要があります。また、管理者がパッケージをインストールし、最初のユーザーが管理者以外のユーザーであるため、ライブラリに書き込むことができない場合を考慮してください。
最悪の場合、これにはパッケージを使用するすべてのユーザー用に〜/ .mypackageディレクトリを作成し、新しいユーザーごとに1回ポストインストールを再実行する必要があります。モジュールがインポートされるたびに、〜/ .mypackageの存在が確認されます。存在しない場合は、ポストインストールを実行して作成します。存在する場合、ポストインストールをスキップします。
他のヒント
Paver は、セットアップツールを次のレベルに引き上げ、カスタムタスクを作成できるようにします。典型的なsetup.pyファイルを拡張し、Paver環境をブートストラップする簡単な方法を提供します。