2011-04-10 13 views
7

Me acaba de entrar en envases con setuptools, y parece que el método recomendado para instalar un script en Python, junto con el módulo de uno es para especificar un nombre de script que llama el nombre de una función, como este:¿Las herramientas de configuración de python admiten el estilo de ejecución `__name__ ==" __main __ "`?

setup(
    # ... 
    entry_points = { 
     "console_scripts": [ 
      "script_name": "project.main:main", 
     ], 
    } 
) 

Esto claramente excluye la forma estándar de hacer que un módulo de python sea ejecutable, que es (la última vez que lo comprobé, que fue hace un tiempo) usar if __name__ == "__main__": do_stuff(). ¿Las herramientas de configuración son compatibles con este estilo, o debería pasar a definir una función principal y especificarla en entry_points?

Respuesta

9

Es: "script_name = project.main:do_stuff con setuptools

setuptools crea comandos que se han script_name que las importaciones y se ejecuta la función project.main:do_stuff, no se ejecute la secuencia de comandos directamente. Debe volver a leer this part (alternate link, si usa Distribute) de los documentos de configuración nuevamente para comprender por qué es así. La secuencia de comandos que crea contiene if __name__ == "__main__" todavía. Entonces sí, esta sigue siendo la manera defacial de hacerlo ejecutar.

Esta es una copia de easy_install instalado con setuptools

#!/usr/bin/python 
# EASY-INSTALL-ENTRY-SCRIPT: 'distribute==0.6.14','console_scripts','easy_install' 
__requires__ = 'distribute==0.6.14' 
import sys 
from pkg_resources import load_entry_point 

if __name__ == '__main__': 
    sys.exit(
     load_entry_point('distribute==0.6.14', 'console_scripts', 'easy_install')() 
    ) 

Creo que lo mejor es definir un punto de entrada y un guión similar a easy_install. Eso importa y usa el punto de entrada, como se muestra en su ejemplo if __name__ == "__main__": do_stuff(). Es ideal para la depuración y las primeras pruebas, también si usa distutils, no hay necesidad de agregar/cambiar nada. También puede tener otra aplicación para llamar a do_stuff() para acceder a su aplicación sin tener que ejecutarla en el intérprete de comandos, que es lo que hace setuptools, distutils copia la secuencia de comandos.

+0

¿Cómo se trata la diferencia en '__name__' para una implementación/desarrollo local frente a la implementación de pypi cuando se usa el registro? Parece que no puedo usar el preffered 'logging.getLogger (__ name __)' ya que produce "' __main__' "en el desarrollador local y" '. ' "para instalar setuptools. – smido

Cuestiones relacionadas