0

これが元の質問だとは想像できませんが、答えが見つからないようです。間違った検索用語を使用しているに違いありません。

私たちのチームは、Python ユーティリティ パッケージを開発しています。これを「ツール」と呼びます。「ツール」のさまざまなクラスには、他のパッケージとモジュールが必要です。

「ツール」には、次のような名前のクラスがいくつかあります。

  • パーサー
  • ロガー
  • フットテスター
  • バーテスター

他に2パックあります。1つは「foo」と呼ばれ、もう1つは「bar」と呼ばれます。一部のチームは「foo」パッケージのみを使用し、一部のチームは「bar」パッケージのみを使用します。「foo」パッケージのみを使用するチームは、「bar」パッケージをインストールしないことが要件です。

「FooTester」クラスには「import foo」が含まれているため、「foo」パッケージが必要です。「BarTester」クラスには「インポート バー」が含まれているため、「バー」パッケージが必要です。

どちらのチームも、スクリプトの先頭に「ツールのインポート」を配置し、それぞれの Tester クラスを使用したいと考えています。

現時点では、「bar」パッケージと「foo」パッケージがインストールされていない限り、これを行うことはできません。

これを行う標準的な方法は何ですか?ある?

4

3 に答える 3

0

それはパッケージの一部であり、パッケージFooTesterの一部であると思います。(または、それぞれが独自のパッケージ/モジュールに含まれている可能性があります。)fooBarTesterbar

fooパッケージを使用するチームがパッケージをインストールしないという要件を考えると、bar両方のテスターを両方が使用するパッケージに入れるのは奇妙に思えtoolsます。

于 2013-02-11T18:04:03.033 に答える
0

解決策が少ない

オプションすべて: すべてをインストールし、特別な要件を無視します

これはあなたの質問には答えませんが、おそらく最も効果的な解決策です。なんらかの理由でインストールが難しいパッケージを持っていない限り、異なるチームのためにそれらのインストールを分離する努力をする価値はありません。それを実装するのに必要な時間を数えると、実現不可能であることがわかります。パッケージのインストールに必要な時間が気になる場合は、コンパイルが必要なパッケージであっても、インストールを 1 秒または 2 秒に短縮するpip 構成の関連 SO 回答を参照してください。

オプション マルチ: ソリューションを複数のマルチレベル パッケージに編成する

ソリューションを次のようなパッケージに分割できます

  • tool.common
  • tool.teamA
  • tool.teamB
  • tool.teamB

この場合、ツールは名前空間パッケージと呼ばれ、空でなければなりません。

どのパッケージも、他のパッケージのインストールを必要とする場合があります。通常、これは、他のtool.commonすべての必須パッケージの一部である可能性があります。

requirements.txtオプション Pip:ファイルで pip を使用する

pipとファイルを使用する他の一般的なパターンがありrequirements.txtます。

pip を使用すると、通常は と呼ばれるテキスト ファイルで宣言されたファイルをインストールできますreuirements.txtが、他の名前でも機能します。

使用する代わりに:

$ pip install tool.teamA

人々は、たとえば次のようにして、どうにかしてコードを動作させることができます。

$ git clone repo4tools

そのリポジトリには、ファイルがあります

  • requirements-teamA.txt
  • requirements-teamB.txt
  • requirements-teamC.txt

他に必要なものは何でも。

各要件ファイルには、特定のチームに必要なパッケージのみが含まれます。

次に、人々は単に次のように呼び出します。

$ cd repo4tools
$ pip install -r requirements-teamA.txt

開発者にとって、特に virtualenv との組み合わせでは、最後のオプションが非常に一般的になりつつあります。チームごとに複数の要件ファイルが存在する場合もあります。1 つは実際に使用するためのもので、もう 1 つは開発およびテスト用などです。

于 2014-04-22T19:58:45.293 に答える
0

「ツール」は、そのクラスを条件付きで定義できます。

fooed = barred = False

try:
    import foo
    fooed = True
    class FooTester(object):
        pass # your class here...
except ImportError:
    pass

try:
    import bar
    barred = True
    class BarTester(object):
        pass # your class here...
except ImportError:
    pass

if not fooed or barred:
    raise RuntimeError("You are not fooed or barred")
于 2013-02-11T18:43:31.670 に答える