2012-04-02 2 views
19

Ho scritto un modulo di estensione Python in C++. Ho intenzione di distribuire il modulo con setuptools. Ci saranno distribuzioni binarie per Windows a 32 e 64 bit (compilate con setup.py bdist_egg) e una distribuzione di origine per piattaforme simili a UNIX (create con setup.py sdist).Come includere il file di licenza nello script setup.py?

Ho intenzione di concedere in licenza il modulo sotto la licenza BSD. Nel mio albero dei sorgenti, il file LICENSE.txt si trova nella cartella superiore insieme a setup.py. Come dovrei includerlo nel pacchetto di installazione?

Ho provato il seguente script setup.py:

from setuptools import setup, Extension 
from glob import glob 

setup(
    name = 'Foo', 
    version = '0.1.0', 
    ext_modules = [Extension('Foo', glob('Source/*.cpp'))], 
    package_data = {'': ['LICENSE.txt']} 
) 

Non ha funzionato, il file di licenza non è incluso nel pacchetto di installazione. Forse perché il file setup.py non definisce alcun pacchetto, solo un singolo modulo di estensione.

Come posso risolvere questo problema?

risposta

12

Uso data_files:

setup(
    name = "Foo", 
    version = "0.1.0", 
    ext_modules = [Extension("Foo", glob("Source/*.cpp"))], 
    data_files = [("", ["LICENSE.txt"])] 
) 

Due osservazioni:

  1. Non c'è bisogno diretta di spedire una licenza con il prodotto, è possibile utilizzare il license metadata in distutils per specificare questo.

  2. Non utilizzare mista single-citazione e virgolette nel codice :)

+0

"LICENSE.txt" deve essere ["LICENSE.txt"]. Il percorso "/" è la root di sistema su UNIX e non esiste su Windows; quando ho provato su Windows ho ricevuto un messaggio di errore su un percorso non esistente. Usare "" invece sembra funzionare; quando ho testato LICENSE.txt è finito nella cartella "C: \ Python27 \ Lib \ site-packages \ Foo-0.1.0-py2.7-win32.egg", la stessa cartella di Foo.pyd – user763305

+0

@ user763305: I ho modificato la mia risposta con le tue osservazioni, mi dispiace. Se la mia risposta ha risolto il problema, considera di contrassegnarlo come accettato facendo clic sul segno di spunta a sinistra della mia risposta. – orlp

-1

Ad esempio:

setup(
    ... 
    license="ZPL", 
    classifiers=[ 
     ... 
     'License :: OSI Approved :: Zope Public License', 
     ... 
     ], 
    ...) 

Inoltre è possibile inserire il testo della licenza in 'long_description' :

setup(
    ... 
    long_description="Package description. \nLicense Text", 
    ...) 
+2

In che modo include una licenza _file_ ovunque? – mbdevpl

-1

scrivere un file setup.cfg e in là specificare:

[metadata] 
license_file = LICENSE.txt 
+1

Non funziona .. – user

+0

@user Sì, immagino lo faccia solo per il file wheel generato, ad esempio quando esegui: 'python setup.py bdist_wheel' https://wheel.readthedocs.io/en/stable/# tra cui-the-licenza-in-the-generated-wheel-lima –