2017-11-30 11 views
2

私は、公開されていない場所での独自の依存関係を持つパッケージを作成しています。 pipがこの特定の依存関係がインストールされていないと判明した場合は、インストールを中止するか、または警告を出力して、依存関係をアンインストールします。私の最後に、おそらくsetup.pyに設定したいのですが、私のパッケージをインストールするときにユーザが指定しなければならないものではありません。Undownloadable dependencies

私は具体的には、を試してみてください。はどこからでも依存関係をダウンロードまたはインストールしてください。特に、pipがPyPIから依存関係をダウンロードしようとすると、誰かが依存関係の名前に何か悪いことを登録し、pipがそれをインストールする可能性があります。

alternate download linksをPyPI以外の場所からダウンロードする依存関係を指定する方法はありますが、依存関係をダウンロードしないようにする方法はありません。

私が見つけた最良の回避策は、install_requiresリストに依存関係を置かないことですが、依存関係が存在しないという警告は表示されず、依存関係なしでパッケージをインストールすると警告は表示されません。

特定の依存関係をダウンロードしないようにする方法はありますか?

答えて

3

ピップは、この特定の依存関係がインストールされていないことを発見した場合、私はインストール中止するかしたい...

私が正しくあなたを理解していれば、独自のパッケージがでインストールされている場合は、あなたがチェックできますsetup.pyでそのパッケージからモジュールをインポートしようとすると、ImportErrorにアボートします。

$ python setup.py sdist 

:車輪がインストールにsetup.pyを起動しませんので、あなたがソースのtarとして、あなたのパッケージを配布する必要があり、今

from distutils.command.build import build as build_orig 
from distutils.errors import DistutilsModuleError 
from setuptools import setup 


class build(build_orig): 

    def finalize_options(self): 
     try: 
      import numpy 
     except ImportError: 
      raise DistutilsModuleError('numpy is not installed. Installation will be aborted.') 
     super().finalize_options() 


setup(
    name='spam', 
    version='0.1', 
    author='nobody', 
    author_email='[email protected]', 
    packages=[], 
    install_requires=[ 
     # all the other dependencies except numpy go here as usual 
    ], 
    cmdclass={'build': build,}, 
) 

:例として、インストールがnumpyで中止すべきである、あなたの依存関係を言ってみましょう私は何ができる

$ pip install dist/spam-0.1.tar.gz 
Processing ./dist/spam-0.1.tar.gz 
    Complete output from command python setup.py egg_info: 
    running egg_info 
    creating pip-egg-info/spam.egg-info 
    writing pip-egg-info/spam.egg-info/PKG-INFO 
    writing dependency_links to pip-egg-info/spam.egg-info/dependency_links.txt 
    writing top-level names to pip-egg-info/spam.egg-info/top_level.txt 
    writing manifest file 'pip-egg-info/spam.egg-info/SOURCES.txt' 
    reading manifest file 'pip-egg-info/spam.egg-info/SOURCES.txt' 

    error: numpy is not installed. Installation will be aborted. 

    ---------------------------------------- 
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/_y/2qk6029j4c7bwv0ddk3p96r00000gn/T/pip-s8sqn20t-build/ 

注:numpyが欠落している時に構築されたタールをインストールしようとするとになりますセットアップスクリプトの先頭にインポートチェック:

from setuptools import setup 

try: 
    import numpy 
except ImportError: 
    raise DistutilsModuleError(...) 

setup(...) 

しかし、この場合には、出力はフォーマットされず、完全なスタックトレースがあまりにも技術的であり、ユーザーを混乱させる可能性が標準出力にこぼれされます。代わりに、インストール時に呼び出されるdistutilsコマンドの1つをサブクラス化して、エラー出力が適切にフォーマットされるようにします。今

、第二部のために:

...または警告を印刷し、アンインストールの依存を続けます。

バージョン7 pip will swallow any output from your setup script以降、これはもう不可能です。 pipが冗長モードで実行されている場合、つまりpip install -v mypkgの場合にのみ、セットアップスクリプトの出力が表示されます。あなたが私に尋ねるなら疑わしい決断。

それにもかかわらず、ここにあなたのセットアップスクリプトでの警告やエラーを発行する例を示します。

from distutils.log import ERROR 

class build(build_orig): 

    def finalize_options(self): 
     try: 
      import numpy 
     except ImportError: 
      # issue an error and proceed 
      self.announce('Houston, we have an error!', level=ERROR) 
      # for warnings, there is a shortcut method 
      self.warn('I am warning you!') 
     super().finalize_options() 
+0

は 'cmdclass'のための任意のドキュメントはありますか?私はそれを見つけることができません。 – user2357112

+0

@ user2357112これはPythonのstdlibの一部です。 [Distutilsを拡張する](https://docs.python.org/3.6/distutils/extending.html)は良い出発点であるはずです。 – hoefling