7

Python パッケージをインストールするだけでなく、setup.py でいくつかのカスタム アクション (init.d スクリプトのインストール、ディレクトリとファイルの作成など) を実行したいです。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},
)

distutils から "setup" と "install" をインポートしても同じことが起こります。easy_install でカスタム クラスを実行する方法はありますか?

明確にするために、Buildout や Paver などの余分なものは使用したくありません。

4

2 に答える 2

5

Paverは setuptools を次のレベルに引き上げ、カスタム タスクを記述できるようにします。典型的な setup.py ファイルを拡張することができ、Paver 環境をブートストラップする簡単な方法を提供します。

于 2009-09-18T21:32:05.340 に答える
4

それはできません。Enthought には、これをサポートする setuptools のカスタム バージョンがありますが、それ以外は、6 月から議論されているウィッシュリスト アイテムとしてバグ トラッカーに含まれています。

ただし、システムをだます方法があり、それらを検討することもできます。1 つの方法は、最も重要なモジュール (パッケージを使用するときに常に最初にインポートされるモジュール) に、最初に呼び出されたときにインストール後のアクションを実行させることです。次に、自分でクリーンアップする必要があります。管理者がパッケージをインストールし、最初のユーザーが管理者以外のユーザーであるためにライブラリに書き込めない場合を検討してください。

最悪の場合、パッケージを使用するユーザーごとに ~/.mypackage ディレクトリを作成し、新しいユーザーごとに postinstall を 1 回再実行する必要があります。モジュールがインポートされるたびに、~/.mypackage の存在がチェックされます。そこにない場合は、postinstall を実行して作成します。そこにある場合は、postinstall をスキップします。

于 2009-10-25T17:49:42.837 に答える