2014-06-25 21 views
5

Paket kurulum komut dosyasında bir python paketinin başarısız olması için standart bir yol var mı?Kurulum sırasında bir python paketi gereksiniminin başarısız olmasına izin verilmesi

Python Social Auth benzeri bir paket sağladığından, bir dizi sağlayıcıya sahiptir.

Bazı sağlayıcıların yükleme gereksinimlerinin başarısız olmasına izin vermenin standart bir yolu var mı, ancak yine de paketin düzgün yüklenmesi gerekiyor mu? Kurulum sırasında kullanıcı tarafından belirtilen

+0

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

cevap

4

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() 
İlgili konular