2009-11-10 2 views
22

グローバルサイトパッケージディレクトリにインストールする "example"というライブラリがあります。しかし、私は生産用とテスト用の2つのバージョンをインストールできるようにしたいと思います(私はこのようにバージョン管理されたWebアプリケーションと他のものを持っています)。カスタムdistutilsコマンド

別のeggをサイトパッケージにインストールするだけでなく、モジュールの名前を "example"から "example_stage"などに変更する "python setup.py stage"という方法がありますか?

もしdistutilsがこれを行うことができないのであれば、他にもできるツールはありますか?

答えて

13

もちろん、distutilsを新しいコマンドで拡張することもできます。あなたのdistutilの設定ファイルでは、追加:

[global] 
command-packages=foo.bar 

これはdistutilsパッケージ自体でdistutils.cfg、ホームディレクトリ(Windowsの場合なし先頭のドット)で..pydistutils.cfg、または現在のディレクトリにsetup.cfgにすることができます。

次に、Pythonのsite-packagesディレクトリにfoo.barパッケージが必要です。

次に、stage、サブクラスdistutils.cmdなど、新しい目的のコマンドを実装するクラスを追加します。ドキュメントは弱いですが、既存のdistutilsコマンドもすべてその方法で構築されているので、たくさんの例があります。

+2

これは質問された質問に答えますが、virtualenvは問題に対するより良い答えです。 –

3

distutilsでこれを行う方法をご希望の場合は、Alex's answerをご覧ください。しかし、私はPaverがこの種のものに適していると感じています。カスタムコマンドを作成したり、既存のコマンドを上書きする方がずっと簡単です。また、distutilsやsetuptoolsに慣れていると、移行は非常に難しいことではありません。

+0

Paverは面白い便利な機能やショートカットをたくさん提供しています。一方、distutilsの上にもう一つのパラダイム(そしてアーキテクチャ)を追加します。私は自己完結型で、実行する必要があるすべてのことを行うプレーンなsetup.pyファイルを好むでしょう。 –

49

これは、distutilsを使用して簡単に行うことができます。distutils.core.Command setup.pyの中にサブクラス化します。例えば

from distutils.core import setup, Command 
import os, sys 

class CleanCommand(Command): 
    description = "custom clean command that forcefully removes dist/build directories" 
    user_options = [] 
    def initialize_options(self): 
     self.cwd = None 
    def finalize_options(self): 
     self.cwd = os.getcwd() 
    def run(self): 
     assert os.getcwd() == self.cwd, 'Must be in package root: %s' % self.cwd 
     os.system('rm -rf ./build ./dist') 

あなたが(設定でそれを参照する必要があり、コマンドを有効にするには):あなたは、何としてもこのよう組み込みコマンドを無効にすることができ

setup(
    # stuff omitted for conciseness. 
    cmdclass={ 
     'clean': CleanCommand 
} 

注意私は「きれい」でやった。 (私は「DIST」と「ビルド」ディレクトリを残しどのようにビルトインバージョンが好きではありませんでした。)が使用されている規則の数

% python setup.py --help-commands | grep clean 
    clean   custom clean command that forcefully removes dist/build dirs. 

あります

  • あなたが指定したが、任意のコマンドライン引数user_options
  • initialize_options()メソッドで使用する変数を宣言します。これは、初期化後に呼び出され、サブクラスのカスタム名前空間を設定します。
  • finalize_options()メソッドは、run()の直前に呼び出されます。
  • コマンド自体の不具合は、run()で発生します。その前に他の準備作業を行ってください。

使用するための最良の例では、まさにこのようなinstall.pyまたはbuild.pyとしてPYTHON_DIR /のdistutils /コマンドで見つけ、デフォルトのコマンドのいずれかのソースコードを見ることです。

+0

[ソース](https://bitbucket.org/pypy/pypy/src/9d88b4875d6e12570a635848524bb7f5283ee558/lib-python/2.7/distutils/command?at=translation-cleanup)(Luke)を使用してください。 –

+0

[docsを読む](https://docs.python.org/2/distutils/apiref.html#creating-a-new-distutils-command)。 –

関連する問題