web-dev-qa-db-ja.com

デフォルトで、「オプションの」依存関係をPython(setuptools)にインストールします

Pythonパッケージはデフォルトでインストールされます from pipである必要がありますが、インストールを考慮すべきではないパッケージのオプションの依存関係を指定する方法はありますか?それらをインストールできない場合は失敗しますか?

install_requiresを指定して、特定のオプションの依存関係を簡単にインストールできるOSを使用するユーザーの90%にパッケージをインストールできることを知っています。また、extra_requireを指定してそのユーザーを指定できることも知っています。これらの機能を取得するためにフルインストールが必要であると宣言できますが、デフォルトのpipインストールでパッケージのインストールを試行する方法は見つかりませんでしたが、インストールできない場合は文句を言いません。

(私がsetuptoolssetup.pyを更新したい特定のパッケージはmusic21と呼ばれ、ツールの95%はmatplotlib、IPython、scipy、pygame、いくつかのあいまいなオーディオツールなどがありますが、これらのパッケージをインストールすると、パッケージに追加の機能と速度が追加されます。デフォルトでこれらの機能を使用できるようにしたいのですが、インストールできない場合はエラーを報告しません)

決して完璧な解決策ではありませんが、インストール後のスクリプトを設定して、次のようなパッケージのインストールを試みることができます。

from distutils.core import setup
from distutils import debug


from setuptools.command.install import install
class PostInstallExtrasInstaller(install):
    extras_install_by_default = ['matplotlib', 'nothing']

    @classmethod
    def pip_main(cls, *args, **kwargs):
        def pip_main(*args, **kwargs):
            raise Exception('No pip module found')
        try:
            from pip import main as pip_main
        except ImportError:
            from pip._internal import main as pip_main

        ret = pip_main(*args, **kwargs)
        if ret:
            raise Exception(f'Exitcode {ret}')
        return ret

    def run(self):
        for extra in self.extras_install_by_default:
            try:
                self.pip_main(['install', extra])
            except Exception as E:
                print(f'Optional package {extra} not installed: {E}')
            else:
                print(f"Optional package {extra} installed")
        return install.run(self)


setup(
    name='python-package-ignore-extra-dep-failures',
    version='0.1dev',
    packages=['somewhat',],
    license='Creative Commons Attribution-Noncommercial-Share Alike license',
    install_requires=['requests',],
    extras_require={
        'extras': PostInstallExtrasInstaller.extras_install_by_default,
    },
    cmdclass={
        'install': PostInstallExtrasInstaller,
    },
)
5
mingaleg

これを行う最も簡単な方法は、pipにシェルアウトして「オプションの」パッケージをインストールするカスタムインストールコマンドを追加することです。あなたのsetup.py

import sys
import subprocess
from setuptools import setup
from setuptools.command.install import install

class MyInstall(install):
    def run(self):
        subprocess.call([sys.executable, "-m", "pip", "install", "whatever"])
        install.run(self)

setup(
    ...

    cmdclass={
        'install': MyInstall,
    },
)

上で述べたhoeflingのように、これはのみソースディストリビューションを公開した場合に機能します(.tar.gzまたは.Zip)。パッケージをビルドされたディストリビューションとして公開した場合は機能しません(.whl)。

2
Dustin Ingram

これはあなたが探しているものかもしれません。これは、「オプションの依存関係」を宣言できるセットアップツールの組み込み機能のようです。

https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies

Ex

setup(
    name="Project-A",
    ...
    extras_require={
        'PDF':  ["ReportLab>=1.2", "RXP"],
        'reST': ["docutils>=0.3"],
    }
)
0
Samy Bencherif