2012-04-02 16 views
19

He escrito un módulo de extensión de Python en C++. Planeo distribuir el módulo con setuptools. Habrá distribuciones binarias para Windows de 32 y 64 bits (compiladas con setup.py bdist_egg) y una distribución fuente para plataformas tipo UNIX (compiladas con setup.py sdist).¿Cómo incluir el archivo de licencia en la secuencia de comandos setup.py?

Planeo licenciar el módulo bajo la licencia BSD. En mi árbol de fuentes, el archivo LICENSE.txt está en la carpeta superior junto con setup.py. ¿Cómo debería incluirlo en el paquete de instalación?

He probado el siguiente 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']} 
) 

No funcionó, el archivo de licencia no está incluido en el paquete de instalación. Tal vez porque el archivo setup.py no define ningún paquete, solo un módulo de extensión único.

¿Cómo puedo solucionar esto?

Respuesta

12

Uso data_files:

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

Dos observaciones:

  1. No hay necesidad directa para enviar una licencia con el producto, se puede utilizar el license metadata en distutils para especificar esto.

  2. No utilice mixta comilla simple y dobles comillas en el código :)

+0

"LICENSE.txt" debe ser ["LICENCIA.txt"]. La ruta "/" es la raíz del sistema en UNIX y no existe en Windows; cuando probé en Windows recibí un mensaje de error sobre una ruta no existente. Usar "" parece funcionar; cuando probé LICENSE.txt terminó en la carpeta "C: \ Python27 \ Lib \ site-packages \ Foo-0.1.0-py2.7-win32.egg", la misma carpeta que Foo.pyd – user763305

+0

@ user763305: I edité mi respuesta con tus comentarios, lo siento. Si mi respuesta resolvió su problema, considere marcarlo como aceptado haciendo clic en la marca de verificación a la izquierda de mi respuesta. – orlp

-1

Por ejemplo:

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

Adicionalmente, puede agregar el texto de licencia en 'long_description' :

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

¿Cómo se incluye una licencia _file_ en cualquier lugar? – mbdevpl

-1

escribir un archivo setup.cfg y allí se especifica:

[metadata] 
license_file = LICENSE.txt 
+1

No funciona .. – user

+0

@user Sí, supongo que solo hace eso para el archivo de rueda generado, es decir, cuando ejecuta: 'python setup.py bdist_wheel' https://wheel.readthedocs.io/en/stable/# including-the-license-in-the-generated-wheel-file –

Cuestiones relacionadas