2014-06-25 2 views
5

Gibt es eine Standardmethode, die es einem Python-Paket ermöglicht, in einem Paket-Setup-Skript fehlzuschlagen?Zulassen, dass eine Python-Paketanforderung in Setup fehlschlägt

Ich erstelle ein Paket ähnlich Python Social Auth in dem es eine Reihe von Anbietern hat.

Gibt es einen Standard Weg, um die Installation Anforderungen von einigen der Anbieter zu scheitern, aber immer noch das Paket installieren Sie gut?

+0

möglich Duplikat weitergegeben werden [Kann ich definieren optionale Pakete in setuptools?] (http://stackoverflow.com/questions/11240285/can-i-define-optional-packages-in-setuptools) ... obwohl @ Jonathan-Villemaire-Krajden Antwort bietet einige zusätzliche Details – Stefano

Antwort

4

Optional angegebenen Abhängigkeiten durch Benutzer bei der Installation:

Sie die extras_require Parameter setup() verwenden: http://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies

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

Mit dieser Methode kann der Benutzer fragen spezifische Erweiterungen pip install Myproject[ProviderX] zu installieren.

Optional basierend Abhängigkeiten von vorhandenen Pakete:

Um automatisch installierten Pakete erkennt, können Sie die Liste der Anforderungen dynamisch aufzubauen. Zum Beispiel können Sie sehen, wie Matplotlib dies tut (sie haben viele optionale Backends zum Plotten unter anderem): https://github.com/matplotlib/matplotlib.

Im Grunde ist setup.py nur normaler Python-Code, daher können Sie eine Funktion ausführen, die nach den optionalen Abhängigkeiten sucht und die Anforderungen anpasst und Ihre Paketliste entsprechend installiert.

Die Art und Weise wie Matplotlib ist, indem Sie eine Klasse für Abhängigkeiten definieren, die es für jede Abhängigkeit (in setupExt.py) erweitert.

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

Es wiederholt sich dann über jede Abhängigkeit in setup.py, ob Kontrollen installiert werden soll, und sich dementsprechend jede Liste zu 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() 
Verwandte Themen