2014-06-25 18 views
5

Czy istnieje standardowy sposób, aby zezwolić na niepowodzenie pakietu Pythona w skrypcie instalacyjnym pakietów?Zezwalanie na wymuszanie pakietu Pythona w konfiguracji

Tworzę pakiet podobny do Python Social Auth pod tym względem, że ma wielu dostawców.

Czy istnieje standardowy sposób, aby umożliwić spełnienie wymagań instalacyjnych niektórych dostawców, ale mimo to instalacja pakietu jest w porządku?

+0

możliwym duplikatu [Mogę określić opcjonalne pakiety w setuptools?] (http://stackoverflow.com/questions/11240285/can-i-define-optional-packages-in-setuptools) ... chociaż odpowiedź @ Jonathan-Villemaire-Krajden zawiera dodatkowe szczegóły – Stefano

Odpowiedz

4

Opcjonalne zależności podane przez użytkownika podczas instalacji:

można użyć parametru extras_require do setup(): http://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies

setup(
    name="MyProject", 
    ... 
    extras_require = { 
     'ProviderX': ["DependencyX1", "DependencyX2"], 
     'ProviderY': ["DependencyY"], 
    } 
) 

Dzięki tej metodzie, użytkownik może poprosić o zainstalowanie konkretnych rozszerzeń pip install Myproject[ProviderX].

Opcjonalne zależności oparte na istniejących pakietów:

W celu automatycznego wykrywania zainstalowanych pakietów, można zbudować listę wymagań dynamicznie. Na przykład możesz sprawdzić, jak robi to matplotlib (mają wiele opcjonalnych backendów do kreślenia między innymi): https://github.com/matplotlib/matplotlib.

Zasadniczo setup.py jest zwykłym kodem Pythona, więc możesz uruchomić funkcję, która sprawdza opcjonalne zależności i dostosować wymagania oraz listę pakietów do zainstalowania.

Sposób w jaki robi to matplotlib, definiując klasę zależności, którą rozszerza dla każdej zależności (w setupExt.py).

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): 
    ... 

Następnie iteracje nad każdym uzależnienia w setup.py, sprawdza, czy to powinno być zainstalowane i odpowiednio wydłuża każdą listy mają być przekazane do 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() 
Powiązane problemy