web-dev-qa-db-fra.com

Différence entre entry_points/console_scripts et les scripts dans setup.py?

Il existe fondamentalement deux manières d'installer les scripts de console Python sur mon chemin par setup.py:

setup(
    ...
    entry_points = {
        'console_scripts': [
            'foo = package.module:func',
        ],
    }
)

et

setup(
    ...
    scripts = [
        'scripts/myscript.sh'
    ]
)

Quelles sont les différences? Je vois que la première approche me permet de choisir Nice, nom spécifique pour mon script, mais y a-t-il d'autres différences? Différents objectifs d'origine, compatibilité (setuptools, distutils, ...?), Utilisation, ...? Je suis assez confus et une réponse élaborée de Nice pourrait m'aider (et probablement aussi d’autres) à bien comprendre tout cela.

Mise à jour: Depuis que j'ai posé la question PyPA publié ces cool documentations sur le sujet .

45
Honza Javorek

Les documents pour le (génial) Click package suggèrent quelques raisons pour utiliser des points d’entrée au lieu de scripts, y compris 

  1. compatibilité entre plates-formes et 
  2. éviter que l'interprète assigne __name__ à __main__, ce qui pourrait entraîner une double importation du code (si un autre module importe votre script)

Click est un bon moyen d'implémenter des fonctions à utiliser comme entry_points, btw.

35
jfeala

Une différence essentielle entre ces deux façons de créer des exécutables en ligne de commande est qu'avec l'approche setuptools (votre premier exemple), vous devez appeler une fonction dans le script. Dans votre cas, il s'agit de la func dans votre module. Cependant, dans l’approche distutils (votre deuxième exemple), vous appelez directement le script (ce qui permet d’être répertorié avec ou sans extension).

13
plessthanpt05

L’approche du point d’entrée des outils d’installation (# 1) a également l’avantage que sous Windows, un fichier .exe pouvant être créé, pouvant être double-cliqué et appelé comme un programme Windows classique. Ceci est en plus d'avoir un script placé dans le chemin bin sur les systèmes posix.

6
Kaushik Ghose

Une autre différence est que, lorsque vous utilisez console_scripts, le fichier init de mon module a été exécuté. Lors de l'utilisation de scripts, le module init n'a pas été exécuté, seul le script a été exécuté.

0
spacether