Pythonパッケージはデフォルトでインストールされます from pip
である必要がありますが、インストールを考慮すべきではないパッケージのオプションの依存関係を指定する方法はありますか?それらをインストールできない場合は失敗しますか?
install_requires
を指定して、特定のオプションの依存関係を簡単にインストールできるOSを使用するユーザーの90%にパッケージをインストールできることを知っています。また、extra_require
を指定してそのユーザーを指定できることも知っています。これらの機能を取得するためにフルインストールが必要であると宣言できますが、デフォルトのpip
インストールでパッケージのインストールを試行する方法は見つかりませんでしたが、インストールできない場合は文句を言いません。
(私がsetuptools
とsetup.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,
},
)
これを行う最も簡単な方法は、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
)。
これはあなたが探しているものかもしれません。これは、「オプションの依存関係」を宣言できるセットアップツールの組み込み機能のようです。
Ex
setup(
name="Project-A",
...
extras_require={
'PDF': ["ReportLab>=1.2", "RXP"],
'reST': ["docutils>=0.3"],
}
)