Opsiyonel bağımlılıkları: Sen setup()
için extras_require
parametresini kullanabilirsiniz
: Bu yöntemle http://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
setup(
name="MyProject",
...
extras_require = {
'ProviderX': ["DependencyX1", "DependencyX2"],
'ProviderY': ["DependencyY"],
}
)
, kullanıcının belirli uzantıları pip install Myproject[ProviderX]
yüklemek isteyebilir. Varolan paketleri dayalı
Opsiyonel bağımlılıkları:
otomatik olarak yüklenir paketleri algılamak için, dinamik şartların listesini oluşturabilirsiniz. Örneğin, matplotlib'in bunu nasıl yaptığına bakabilirsiniz (diğerleri arasında çizim yapmak için birçok isteğe bağlı arka plana sahiptir): https://github.com/matplotlib/matplotlib.
Temel olarak, setup.py sadece düzenli bir python kodudur, böylece isteğe bağlı bağımlılıkları denetleyen bir işlevi çalıştırabilir ve gereksinimlerinizi ve buna göre yüklenecek paket listenizi ayarlayabilirsiniz.
Matplotlib'in yaptığı gibi, her bir bağımlılık için (setupExt.py'de) uzandığı bağımlılıklar için bir sınıf tanımlamaktır.
class SetupPackage(object):
optional = False
def check(self):
"""
Checks whether the dependencies are met. [...]
"""
pass
def get_packages(self):
"""
Get a list of package names to add to the configuration.
These are added to the `packages` list passed to
`distutils.setup`.
"""
return []
def get_namespace_packages(self):
"""
Get a list of namespace package names to add to the configuration.
These are added to the `namespace_packages` list passed to
`distutils.setup`.
"""
return []
def get_py_modules(self):
"""
Get a list of top-level modules to add to the configuration.
These are added to the `py_modules` list passed to
`distutils.setup`.
"""
return []
...
class Numpy(SetupPackage):
...
Daha sonra setup.py dosyası, her bağımlılık üzerinde dolaşır, kontroller yüklenmesi gereken olup, ve uygun bir şekilde setup()
mpl_packages = [
'Building Matplotlib',
setupext.Six(),
setupext.Dateutil(),
...
good_packages = []
for package in mpl_packages:
[...]
# check and append
if ...
good_packages.append(package)
[...]
for package in good_packages:
if isinstance(package, str):
continue
packages.extend(package.get_packages())
namespace_packages.extend(package.get_namespace_packages())
py_modules.extend(package.get_py_modules())
ext = package.get_extension()
mümkün kopya geçirilecek her liste uzanır [I isteğe bağlı paketler tanımlayabilir setuptools?] (http://stackoverflow.com/questions/11240285/can-i-define-optional-packages-in-setuptools) ... Ancak Jonathan-Villemaire-Krajden yanıtı bazı ek ayrıntılar sağlar – Stefano