2013-07-23 25 views
27

How to extend distutils with a simple post install script?で説明されているように、インストール後のタスクをPythonのdistutilsに追加しようとしています。このタスクは、インストールされたlibディレクトリにあるPythonスクリプトを実行することになっています。このスクリプトは、インストールされたパッケージに必要な追加のPythonモジュールを生成します。distutils/setuptoolsを使用して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つの不備があります。ユーザー以外のPythonインタプリタを使用している場合

  1. を1つがPATHから選択された場合、インストール後のスクリプトは異なるインタプリタで実行され、問題が発生する可能性があります。
  2. ドライランなどでは安全ではありません。私はそれを関数にラップしてdistutils.cmd.Command.executeで呼び出すことで解決できるかもしれません。

ソリューションを改善するにはどうすればよいですか?これを行うための推奨された方法/ベストプラクティスはありますか?可能であれば、別の依存関係を避けることをお勧めします。これらの欠乏症に対処するための

+0

'python setup.py install'や' pip install'も使いたい人は、http://stackoverflow.com/questions/21915469/python-setuptools-install-requiresを参照してください。 -is-ignored-over-override-cmdclass –

答えて

34

方法は次のとおりです。

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

    しかし、the --dry-run option is currently brokenとは、とにかく意図したとおりに動作しません。

私は、次の解決策になってしまった:それはpython setup.py --help-commandsが使用するものですので、私は私の派生クラスのクラス名installを使用

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}, 
) 

注意。

+0

ありがとう、これは本当に助けになりました。私もフォローする必要がありました(http://stackoverflow.com/questions/15853058/run-custom-task-when-call-pip-install)私のpipのインストールのエラーを避けるために。私はすべてのブログ記事(http://diffbrent.ghost.io/correctly-adding-nltk-to-your-python-package-using-setup-py-post-install-commands/)にまとめました。私が何かを見逃したら私に知らせてください。 –

+0

@ brent.payne助けてくれてうれしい!私がなぜ 'install'をクラス名として使用したのかについての私のコメントに注目してください。 – kynan

+1

それは動作しますが、カスタムインストールを 'pip install -e name'で実行できませんでした。 ps、ちょうど[このリンク](http://www.niteoweb.com/blog/setuptools-run-custom-code-during-install)が見つかった場合は、BONUSセクションを参照してください。 – Paolo

関連する問題