webentwicklung-frage-antwort-db.com.de

Unterschied zwischen entry_points/console_scripts und Skripten in setup.py?

Grundsätzlich gibt es zwei Möglichkeiten, Python-Konsolenskripts über setup.py in meinem Pfad zu installieren:

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

und

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

Was sind die Unterschiede? Ich sehe, der erste Ansatz erlaubt es mir, Nizza, einen bestimmten Namen für mein Skript, zu wählen, aber gibt es andere Unterschiede? Unterschiedliche ursprüngliche Zwecke, Kompatibilität (Setuptools, Distutils, ...?), Verwendung, ...? Ich bin ziemlich verwirrt und eine schöne Antwort von Nizza könnte mir (und wahrscheinlich auch anderen) helfen, das alles richtig zu verstehen.

Update: Seit ich die Frage gestellt habe PyPA Published diese coolen Dokumente zum Thema .

45
Honza Javorek

Die Dokumente für das (awesome) Click-Paket schlagen einige Gründe vor , um Einstiegspunkte anstelle von Skripts zu verwenden, einschließlich 

  1. plattformübergreifende Kompatibilität und 
  2. vermeiden, dass der Interpreter __name____main__ zuweist, wodurch Code zweimal importiert werden kann (wenn ein anderes Modul Ihr Skript importiert)

Click ist eine nette Möglichkeit, Funktionen zur Verwendung als entry_points, btw zu implementieren.

35
jfeala

Ein wesentlicher Unterschied zwischen diesen beiden Methoden zum Erstellen von Befehlszeilenprogrammen besteht darin, dass Sie mit dem Ansatz setuptools (dem ersten Beispiel) eine Funktion innerhalb des Skripts aufrufen müssen - in Ihrem Fall ist dies die func innerhalb Ihres module. In der distutils-Methode (Ihrem zweiten Beispiel) rufen Sie das Skript jedoch direkt auf (wodurch eine Liste mit oder ohne Erweiterung möglich ist).

13
plessthanpt05

Der Einstiegspunkt für Setup-Tools (# 1) hat auch den Vorteil , dass unter Windows eine EXE-Datei erstellt wird, die doppelt angeklickt und wie ein normales Windows-Programm aufgerufen werden kann. Dies gilt zusätzlich dazu, wenn auf posix-ähnlichen Systemen ein Skript im bin-Pfad platziert wird.

6
Kaushik Ghose

Ein weiterer Unterschied ist, dass bei der Verwendung von console_scripts die Datei init meines Moduls ausgeführt wurde. Bei der Verwendung von Skripts wurde das Modul init nicht ausgeführt, sondern nur das Skript.

0
spacether