2016-07-11 7 views
2

一部のPythonパッケージでは、依存関係として2つのパッケージのいずれかが必要です。たとえば、Ghost.pyには、PySideまたはPyQt4が必要です。要件ファイルに2つの依存関係のうちの1つだけを要求する

このような依存関係をrequirements.txtファイルに含めることは可能ですか?これらのファイルで動作する 'or'演算子はありますか?

これらの要件をファイルに追加すると、そのうちの1つだけがインストールされます。

答えて

2

現在、pipのrequirement.txtもsetuptoolsも直接このような構成を許可していません。両方とも、要件のリストを指定する必要があります。要件のバージョンを制限することはできますが、それだけです。次のように

インサイドPythonは、あなたがこのような状況に対処することができます

try: 
    import dependency1 

    def do_it(x): 
     return dependency1.some_function(x) 
except ImportError: 
    try: 
     import dependency2 

     def do_it(x) 
      return dependency2.another_function(x) 
    except ImportError: 
     raise ImportError('You must install either dependency1 or ' 
          + 'dependecy2!') 

は今do_itはどちらかdependency1.some_functionまたはdependency2.another_function使用し、これに応じて利用可能です。

それでも、要件を指定する方法の問題が残されます。

  1. が正式にユーザーが依存関係の1つインストールする必要がありますrequirements.txtまたはsetup.pyが、文書内の要件を指定しないでください:私は2つのオプションを参照してください。この方法は、ソフトウェアの設定で追加の手動ステップが必要な場合(つまり、pip install my_tool以上の場合)は問題ありません。
  2. requirements.txtまたはsetup.pyに希望の要件をハードコードします。

最後に、なぜ人々が他の依存関係を使用したいのかを尋ねる必要があります。私は通常、(ディスク)スペースがあるため、私が使用するライブラリの依存性についてはあまり気にしませんでした。安価であり(virtualenvのため)、互換性のリスクはほとんどありません。したがって、同じ機能に対して2つの異なる依存関係をサポートしないことを考えることをお勧めします。

pip install $(requirements.py) 

1

私はこの

#!/usr/bin/env python 
packages = 'p1 p2 p3'.split() 

try: 
    import optional1 
except ImportError: # opt1 not installed 
    try: 
     import optional2 
    except ImportError: # opt2 not installed 
     packages.append('optional2') 

print(' '.join(packages)) 

chmod +x requirements.py 

で、このスクリプトを実行可能にしており、最終的にはこのようにそれをピップを実行達成するために、小さなPythonスクリプトを使用します'$(requirements.py)'はrequirements.pyスクリプトを実行し、その出力を入れます(この場合、pacのリストkages)をピップにインストールする。

+0

興味深い。私はあなたが 'pip'でこのような構文を使うことができるのか分かりませんでした。 –

関連する問題