2011-11-09 19 views
12

Dada la siguiente (demostración) diseño del proyecto:Crear diferentes tipos de distribución con setup.py

MyProject/ 
    README 
    LICENSE 
    setup.py 
    myproject/ 
     ... # packages 
    extrastuff/ 
     ... # some extra data 

cómo (y dónde) no Declaro diferentes tipos de distribución? Especialmente Necesito estas dos opciones:

  1. Una distribución que contiene sólo la fuente

  2. Una distribución que contiene la fuente y todos los archivos de datos bajo (extrastuff)

Idealmente, ¿cómo declarar las dos configuraciones superiores, mientras que la segunda depende de la primera?

+1

¿Por qué no crear diferentes archivos 'setup.py'? La distribución fuente está disponible como 'sdist'. –

+0

@Brian: estoy al tanto de 'sdist', gracias. Soy mantenedor de un proyecto de código abierto de escala media, y me gustaría adherirme a las convenciones comunes (como tener una 'setup.py' que administre el empaque/instalación). Realmente quiero ver una solución que solo use una secuencia de comandos de configuración. – Constantinius

+0

No puedo proporcionar detalles porque no he tenido ese tipo de problema antes. Un enfoque podría ser proporcionar su propio comando 'sdist' que simplemente llame al viejo' sdist' con diferentes metadatos que dependen de la distribución objetivo. La distribución se puede proporcionar como una opción desde la línea de comando o usando 'platform.linux_distribution' para obtener la misma distribución de destino que la de la máquina que llama' setup.py' de manera predeterminada. – jcollado

Respuesta

11

He implementado algo como esto antes ... el comando sdist se puede extender para manejar argumentos de línea de comando adicionales y para manipular los archivos de datos basados ​​en estos. Si ejecuta python setup.py sdist --help, incluirá sus argumentos de línea de comando personalizados en la ayuda, lo cual es bueno. Use la siguiente receta:

from distutils import log 
from distutils.core import setup 
from distutils.command.sdist import sdist 

class CustomSdist(sdist): 

    user_options = [ 
     ('packaging=', None, "Some option to indicate what should be packaged") 
    ] + sdist.user_options 

    def __init__(self, *args, **kwargs): 
     sdist.__init__(self, *args, **kwargs) 

     self.packaging = "default value for this option" 

    def get_file_list(self): 

     log.info("Chosen packaging option: {self.packaging}".format(self=self)) 

     # Change the data_files list here based on the packaging option 
     self.distribution.data_files = list(
      ('folder', ['file1', 'file2']) 
     ) 
     sdist.get_file_list(self) 

if __name__ == "__main__": 

    setup(
     name = "name", 
     version = "version", 
     author = "author", 
     author_email = "author_email", 
     url = "url", 
     py_modules = [ 
      # ... 
     ], 
     packages = [ 
      # ... 
     ], 
#  data_files = default data files for commands other than sdist if you wish 
     cmdclass={ 
      'sdist': CustomSdist 
     } 
    ) 
+0

Muchas gracias por esa solución, creo que iré por esa. – Constantinius

3

Puede extender setup.py para incluir adicionalmente algunos análisis de línea de comandos personalizados. A continuación, puede capturar un argumento personalizado y quitarlo para que no afecte al setuptools.

Puede acceder al argumento de la línea de comando en sys.argv. En cuanto a la modificación de la llamada a setuptools.setup(), recomiendo crear un diccionario de argumentos para aprobar, modificar el diccionario de la base de los argumentos de línea de comandos, y luego llamar setup() usando la notación **dict, así:

from setuptools import setup 
import sys 

basic = {'name': 'my program'} 
extra = {'bonus': 'content'} 

if '--extras' in sys.argv: 
    basic.update(extra) 
    sys.argv.remove('--extras') 

setup(**basic) 

Para más exhaustiva El análisis de línea de comandos también puede usar el getopt module, o el más nuevo argparse module si solo está apuntando a Python 2.7 y superior.

EDIT: También encontré una sección en la documentación de distutils titulada Creating a new Distutils command. Eso también puede ser un recurso útil.

+1

He encontrado que el comando 'sdist' (de distutils) se queja de argumentos desconocidos en la línea de comandos si prueba este tipo de cosas. – wutz

+0

Acabo de probar esto usando el archivo setup.py del proyecto de analizador de feedparser utilizando la opción '--extras' para cambiar el nombre del proyecto (y en consecuencia el nombre de archivo de salida). Funcionó sin un error. ¿Intentó modificar 'sys.argv' antes de llamar a la función' setup() '? –

+0

Esta es una solución simple y agradable, entonces +1 para eso. Creo que wutz mencionó anteriormente que es posible crear comandos distutils personalizados. ¡Gracias de todos modos! – Constantinius

Cuestiones relacionadas