35

簡単なポスト インストール スクリプトで distutils を拡張する方法で説明されているように、Python distutils にポスト インストール タスクを追加しようとしています。. このタスクは、インストールされた lib ディレクトリでPython スクリプトを実行することになっています。このスクリプトは、インストールされたパッケージが必要とする追加の Python モジュールを生成します。

私の最初の試みは次のとおりです。

from distutils.core import setup
from distutils.command.install import install

class post_install(install):
    def run(self):
        install.run(self)
        from subprocess import call
        call(['python', 'scriptname.py'],
             cwd=self.install_lib + 'packagename')

setup(
 ...
 cmdclass={'install': post_install},
)

このアプローチは機能しますが、私が知る限り、2 つの欠点があります。

  1. ユーザーが から選択したもの以外の Python インタープリターを使用した場合、PATHインストール後のスクリプトは別のインタープリターで実行され、問題が発生する可能性があります。
  2. 関数でラップしてdistutils.cmd.Command.execute.

どうすればソリューションを改善できますか? これを行うための推奨される方法/ベストプラクティスはありますか? 可能であれば、別の依存関係を引き込むことは避けたいです。

4

2 に答える 2

38

これらの欠点に対処する方法は次のとおりです。

  1. setup.pyから実行されている Python インタープリターへのフル パスを取得しsys.executableます。
  2. から継承するクラスdistutils.cmd.Command(distutils.command.install.installここで使用するものなど)executeは、指定された関数を「安全な方法」で実行するメソッドを実装します。つまり、dry-run フラグを尊重します。

    ただし、この--dry-runオプションは現在壊れており、意図したとおりに機能しないことに注意してください。

私は次の解決策になりました:

import os, sys
from distutils.core import setup
from distutils.command.install import install as _install


def _post_install(dir):
    from subprocess import call
    call([sys.executable, 'scriptname.py'],
         cwd=os.path.join(dir, 'packagename'))


class install(_install):
    def run(self):
        _install.run(self)
        self.execute(_post_install, (self.install_lib,),
                     msg="Running post install task")


setup(
    ...
    cmdclass={'install': install},
)

install派生クラスのクラス名を使用することに注意してください。それpython setup.py --help-commandsが使用されるためです。

于 2013-08-10T08:07:49.080 に答える