Was ist setup.py?

990

Kann jemand bitte erklären, was setup.pyist und wie es konfiguriert oder verwendet werden kann?

Software-Enthusiasten
quelle
7
Eric: Bessere Beispiele, die alles zusammenstellen, wären von
Vorteil
1
Für mich war es immer seltsam, wie Sie das Paket installieren, das Sie extrahieren und das Skript darin ausführen, anstatt einen Paketmanager auf das zu verweisen, was Sie heruntergeladen haben. Das wäre natürlicher. stackoverflow.com/questions/1471994/what-is-setup-py/…
Colonel Panic

Antworten:

694

setup.py ist eine Python-Datei, die Ihnen normalerweise mitteilt, dass das Modul / Paket, das Sie installieren möchten, mit Distutils gepackt und verteilt wurde. Dies ist der Standard für die Verteilung von Python-Modulen.

Auf diese Weise können Sie Python-Pakete einfach installieren. Oft reicht es zu schreiben:

$ pip install . 

pipverwendet setup.py, um Ihr Modul zu installieren. Vermeiden Sie es anzurufensetup.py direkt .

https://docs.python.org/3/installing/index.html#installing-index

Silfverstrom
quelle
9
Ich würde mich freuen, wenn Sie Ihr Wissen darüber teilen, wie diese Module erstellt oder gehandhabt werden. Zum Beispiel, wie man ein Basismodul erstellt oder wie man ein Skript auf ./mymodule/bin testet, das aus ./mymodule/libs/ importiert wird
Paulo Oliveira
7
@PauloOliveira Siehe Verteilen von Python-Modulen, in dem Distutils beschrieben wird, insbesondere 2. Schreiben des Setup- Skripts .
Yous
4
NIEMALS python setup.py VERWENDEN! Es bricht deine Versionierung! stackoverflow.com/questions/4324558/…
devinbost
2
@MikeS Ich weiß nicht genau, was die Problemumgehung ist, aber ich kann Ihnen sagen, dass das Ausführen von setup.py mich zu Albtraumproblemen geführt hat, die viele Stunden Bereinigung erforderten. Ich vermute, dass das Bauen / Bündeln mit Pip oder Conda die Lösung wäre.
Devinbost
3
Sie könnten den Link ändern docs.python.org/3/installing/index.html , die die Nicht-Legacy - Dokumentation Link ist, und auch, es wäre gut , einen Link hinzuzufügen packaging.python.org/tutorials/distributing- packages / # setup-py, in dem der Zweck der setup.pyDatei erläutert wird .
Alvaro Gutierrez Perez
492

Es ist hilfreich, ein Python-Paket fooauf Ihrem Computer zu installieren (kann auch vorhanden sein virtualenv), damit Sie das Paket fooaus anderen Projekten und auch aus [I] Python-Eingabeaufforderungen importieren können .

Es macht den ähnlichen Job pip, easy_installusw.,


Verwenden von setup.py

Beginnen wir mit einigen Definitionen:

Paket - Ein Ordner / Verzeichnis, das eine __init__.pyDatei enthält .
Modul - Eine gültige Python-Datei mit der .pyErweiterung.
Verteilung - Wie sich ein Paket auf andere Pakete und Module bezieht .

Angenommen, Sie möchten ein Paket mit dem Namen installieren foo. Dann tust du es

$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install

Stattdessen, wenn Sie es nicht tatsächlich installieren möchten, es aber dennoch verwenden möchten. Dann mach,

$ python setup.py develop  

Dieser Befehl erstellt Symlinks zum Quellverzeichnis innerhalb von Site-Paketen, anstatt Dinge zu kopieren. Aus diesem Grund ist es ziemlich schnell (insbesondere für große Pakete).


Erstellen setup.py

Wenn Sie Ihren Paketbaum mögen,

foo
├── foo
   ├── data_struct.py
   ├── __init__.py
   └── internals.py
├── README
├── requirements.txt
└── setup.py

Anschließend führen Sie in Ihrem setup.pySkript Folgendes aus, damit es auf einem Computer installiert werden kann:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

Wenn Ihr Paketbaum komplexer ist als der folgende:

foo
├── foo
   ├── data_struct.py
   ├── __init__.py
   └── internals.py
├── README
├── requirements.txt
├── scripts
   ├── cool
   └── skype
└── setup.py

Dann wäre Ihr setup.pyin diesem Fall wie folgt:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Füge mehr Zeug zu ( setup.py) hinzu und mache es anständig:

from setuptools import setup

with open("README", 'r') as f:
    long_description = f.read()

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   license="MIT",
   long_description=long_description,
   author='Man Foo',
   author_email='[email protected]',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Das long_descriptionwird in pypi.org als README-Beschreibung Ihres Pakets verwendet.


Und schließlich können Sie Ihr Paket jetzt auf PyPi.org hochladen, damit andere Ihr Paket mithilfe von installieren könnenpip install yourpackage .

Der erste Schritt besteht darin, Ihren Paketnamen und Speicherplatz in pypi mit folgenden Angaben zu beanspruchen:

$ python setup.py register

Sobald Ihr Paketname registriert ist, kann niemand ihn beanspruchen oder verwenden. Nach erfolgreicher Registrierung müssen Sie Ihr Paket dort (in die Cloud) hochladen durch,

$ python setup.py upload

Optional können Sie Ihr Paket auch mit unterschreiben GPG,

$ python setup.py --sign upload

Bonus : Sehen Sie hier ein Beispiel setup.pyaus einem realen Projekt:torchvision-setup.py

kmario23
quelle
12
Kenneth Reitz (Autor des Ehrwürdigen requests) hat dieses Projekt, um explizit ein gutes Beispiel für setup.py - github.com/kennethreitz/setup.py
boweeb
Was ist mit Unterpaketen, dh Ordnern mit Modulen innerhalb des Pakets?
fhchl
1
@ kmario23 Schöne Erklärung, danke!
Dinko Pehar
1
Ich liebe diese Antwort
SW_user2953243
1
@ SW_user2953243 Ich bin froh, dass Sie es nützlich fanden :)
kmario23
98

setup.pyist Pythons Antwort auf ein Installationsprogramm und eine makeDatei für mehrere Plattformen .

Wenn Sie mit Befehlszeileninstallationen vertraut sind, wird in make && make installübersetzt python setup.py build && python setup.py install.

Einige Pakete sind reines Python und werden nur bytekompiliert. Andere enthalten möglicherweise nativen Code, für den ein nativer Compiler (wie gccoder cl) und ein Python-Schnittstellenmodul (wie swigoder pyrex) erforderlich sind .

Whatnick
quelle
1
Wenn also gemäß der obigen Analogie das Erstellen des Moduls aus irgendeinem Grund fehlschlug, würde ich am Skript setup.py basteln ... richtig?
MonaLisaOverdrive
1
Ja, möglicherweise können Sie auch einige Konfigurationsdateien anzeigen.
Whatnick
3
Korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, es gibt einen kleinen Unterschied zwischen den beiden. python setup.py install wird tatsächlich python setup.py buildzuerst ausgeführt (Sie müssen sie also nur in bestimmten Fällen separat ausführen). Ich glaube, muss makeimmer manuell ausgeführt werden, bevor es ausgeführt wird make install.
Joelostblom
6
@cheflo Erfordert eigentlich makekeine spezifischen Parameter (oder Reihenfolge): Es liegt ganz beim Ersteller, Makefilewelche "Ziele" verfügbar sind (und in welcher Reihenfolge sie aufgerufen werden müssen). Da Bare Makefiles (normalerweise) nicht sehr portabel sind, werden sie in der Regel mit Befehlen wie ./configure(autotools) oder cmake .(cmake) generiert. Daher liegt es an diesen Programmen, zu definieren, ob Sie makevorher explizit ausführen müssen make installoder nicht.
ntninja
3
Ich brauche jemanden, der mir sagt, ob wir die setup.py weiterhin gemäß den Dokumenten unter docs.python.org/3/installing/index.html verwenden sollen. "Während die direkte Verwendung von Distutils ausläuft, ... "
Kemin Zhou
53

Wenn Sie ein Paket heruntergeladen haben, dessen Stammordner "setup.py" enthält, können Sie es durch Ausführen installieren

python setup.py install

Wenn Sie ein Projekt entwickeln und sich fragen, wofür diese Datei nützlich ist, lesen Sie die Python-Dokumentation zum Schreiben des Setup-Skripts

Pēteris Caune
quelle
20

setup.pyist ein Python-Skript, das normalerweise mit Bibliotheken oder Programmen geliefert wird, die in dieser Sprache geschrieben sind. Zweck ist die korrekte Installation der Software.

Viele Pakete verwenden das distutilsFramework in Verbindung mit setup.py.

http://docs.python.org/distutils/

Ferdinand Beyer
quelle
19

setup.py kann in zwei Szenarien verwendet werden: Erstens möchten Sie ein Python-Paket installieren. Zweitens möchten Sie Ihr eigenes Python-Paket erstellen. Normalerweise enthält das Standard-Python-Paket einige wichtige Dateien wie setup.py, setup.cfg und Manifest.in. Wenn Sie das Python-Paket erstellen, bestimmen diese drei Dateien den Namen, die Version, die Beschreibung, andere erforderliche Installationen (normalerweise in der TXT-Datei) und einige andere Parameter (Inhalt in PKG-INFO unter dem Ordner "info-info"). setup.cfg wird von setup.py gelesen, während das Paket erstellt wird (könnte tar.gz sein). In Manifest.in können Sie definieren, was in Ihrem Paket enthalten sein soll. Wie auch immer, Sie können eine Menge Dinge mit setup.py wie tun

python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo]  (to upload package to pypi or local repo)

Es gibt eine Reihe anderer Befehle, die mit setup.py verwendet werden können. für Hilfe

python setup.py --help-commands
Avichal Badaya
quelle
Danke für die python setup.py --help-commands. Sehr nützlich beim Stöbern in der setup.py.
Palec
8

Wenn Sie ein Paket herunterladen, setup.pyöffnen Sie Ihr Terminal (Mac, Linux) oder die Eingabeaufforderung (Windows). Mit der cd Tabulatortaste können Sie den Pfad direkt zu dem Ordner festlegen, in den Sie die Datei heruntergeladen haben und in dem sich Folgendes befindet setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Drücken Sie die Eingabetaste. Sie sollten ungefähr Folgendes sehen:

iMac:pakagefolderwithsetupfile user$

Geben Sie danach Folgendes ein python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Drücken Sie enter. Erledigt!

GM
quelle
7

Um ein heruntergeladenes Python-Paket zu installieren, extrahieren Sie das Archiv und führen das Skript setup.py aus:

python setup.py install

Für mich hat sich das immer seltsam angefühlt. Es wäre natürlicher, einen Paketmanager auf den Download zu verweisen, wie dies bei Ruby und Nodejs der Fall wäre, z.gem install rails-4.1.1.gem

Ein Paketmanager ist auch komfortabler, weil er vertraut und zuverlässig ist. Auf der anderen Seite ist jedes neu setup.py, weil es spezifisch für das Paket ist. Es erfordert Vertrauen in die Konvention "Ich vertraue darauf, dass dieses setup.py dieselben Befehle wie andere verwendet, die ich in der Vergangenheit verwendet habe". Das ist eine bedauerliche Steuer auf geistige Willenskraft.

Ich sage nicht, dass der setup.py-Workflow weniger sicher ist als ein Paketmanager (ich verstehe, dass Pip nur die setup.py im Inneren ausführt), aber ich bin sicher, dass es unangenehm und irritierend ist. Es gibt eine Harmonie zwischen Befehlen, die sich alle auf dieselbe Paketmanageranwendung beziehen. Sie könnten es sogar lieben.

Oberst Panik
quelle
1
Dann könnten Sie easy_install oder ähnliches verwenden. Übrigens hat Python Eier, ähnlich wie Rubinsteine.
Pavel Šimerda
7

setup.pyist eine Python-Datei wie jede andere. Es kann einen beliebigen Namen annehmen, es sei denn, es wird konventionell benannt, setup.pydamit es nicht bei jedem Skript eine andere Prozedur gibt.

Am häufigsten setup.pywird verwendet, um ein Python-Modul zu installieren, aber Server für andere Zwecke:

Module:

Vielleicht ist dies die bekannteste Verwendung setup.pyin Modulen. Obwohl sie mit installiert werden können pip, waren alte Python-Versionen pipstandardmäßig nicht enthalten und mussten separat installiert werden.

Wenn Sie ein Modul installieren wollten, aber nicht installieren wollten, pipbestand die einzige Alternative darin, das Modul aus einer setup.pyDatei zu installieren . Dies könnte über erreicht werden python setup.py install. Dies würde das Python-Modul im Root-Wörterbuch installieren (ohne pip, easy_installect).

Diese Methode wird häufig verwendet, wenn pipein Fehler auftritt. Wenn beispielsweise die richtige Python-Version des gewünschten Pakets pipmöglicherweise nicht verfügbar ist, weil sie nicht mehr verwaltet wird, laden Sie die Quelle herunter und führen Sie sie auspython setup.py install das Ausführen dasselbe ausführen, außer wenn kompilierte Binärdateien erforderlich sind (dies wird jedoch ignoriert Python-Version - sofern kein Fehler zurückgegeben wird).

Eine andere Verwendung setup.pyist die Installation eines Pakets aus dem Quellcode. Wenn sich ein Modul noch in der Entwicklung befindet, sind die Raddateien nicht verfügbar. Die einzige Möglichkeit zur Installation besteht darin, sie direkt von der Quelle zu installieren.

Erstellen von Python-Erweiterungen:

Wenn ein Modul erstellt wurde, kann es mithilfe eines Distutils-Setup-Skripts in ein Modul konvertiert werden, das zur Verteilung bereit ist . Einmal erstellt, können diese mit dem obigen Befehl installiert werden.

Ein Setup-Skript ist einfach zu erstellen und sobald die Datei richtig konfiguriert wurde und durch Ausführen kompiliert werden kann python setup.py build(siehe Link für alle Befehle).

Wiederum ist es setup.pynach Benutzerfreundlichkeit und Konvention benannt, kann aber jeden Namen annehmen.

Cython:

Eine weitere bekannte Verwendung von setup.pyDateien sind kompilierte Erweiterungen. Diese erfordern ein Setup-Skript mit benutzerdefinierten Werten. Sie ermöglichen eine schnelle (aber einmal kompilierte, plattformabhängige) Ausführung. Hier ist ein einfaches Beispiel aus der Dokumentation :

from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = 'Hello world app',
    ext_modules = cythonize("hello.pyx"),
)

Dies kann über kompiliert werden python setup.py build

Cx_Freeze:

Ein weiteres Modul, das ein Setup-Skript erfordert, ist cx_Freeze. Dadurch wird das Python-Skript in ausführbare Dateien konvertiert. Auf diese Weise können viele Befehle wie Beschreibungen, Namen, Symbole und Pakete ect einschließen, ausschließen und nach der Ausführung eine verteilbare Anwendung erstellen. Ein Beispiel aus der Dokumentation :

import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]} 

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "guifoo",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("guifoo.py", base=base)])

Dies kann über kompiliert werden python setup.py build.

Was ist eine setup.pyDatei?

Ganz einfach, es ist ein Skript, das etwas in der Python-Umgebung erstellt oder konfiguriert.

Wenn ein Paket verteilt wird, sollte es nur ein Setup-Skript enthalten. Es ist jedoch nicht ungewöhnlich, mehrere zu einem einzigen Setup-Skript zu kombinieren. Beachten Sie, dass dies häufig, distutilsaber nicht immer der Fall ist (wie ich in meinem letzten Beispiel gezeigt habe). Die Sache, an die man sich erinnern sollte, konfiguriert nur das Python-Paket / -Skript auf irgendeine Weise.

Es wird der Name verwendet, sodass beim Erstellen oder Installieren immer derselbe Befehl verwendet werden kann.

Simon
quelle
6

Um es einfach zu machen, wird setup.py so ausgeführt, als würden "__main__"Sie beim Aufrufen der Installationsfunktionen die anderen genannten Antworten aufrufen . In setup.py sollten Sie alles einfügen, was Sie zur Installation Ihres Pakets benötigen.

Allgemeine setup.py-Funktionen

In den folgenden beiden Abschnitten werden zwei Dinge erläutert, die viele setup.py-Module haben.

setuptools.setup

Mit dieser Funktion können Sie Projektattribute wie den Namen des Projekts, die Version usw. angeben . Am wichtigsten ist, dass Sie mit dieser Funktion andere Funktionen installieren können, wenn sie ordnungsgemäß verpackt sind. Auf dieser Webseite finden Sie ein Beispiel für setuptools.setup.

Diese Attribute von setuptools.setup ermöglichen die Installation der folgenden Pakettypen:

  • Pakete, die in Ihr Projekt importiert und mit setuptools.findpackages in PyPI aufgelistet werden :

    packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

  • Pakete nicht in PyPI , können aber mithilfe von dependency_links von einer URL heruntergeladen werden

    dependency_links=["http://peak.telecommunity.com/snapshots/",]

Benutzerdefinierte Funktionen

In einer idealen Welt setuptools.setupwürde alles für Sie erledigen. Dies ist leider nicht immer der Fall. Manchmal muss man bestimmte Dinge zu tun, wie Abhängigkeiten mit der Installation subprocess Befehl, um das System zu erhalten Sie auf im richtigen Zustand für Ihr Paket gerade installieren. Versuchen Sie dies zu vermeiden, diese Funktionen werden verwirrend und unterscheiden sich häufig zwischen Betriebssystem und gleichmäßiger Verteilung .

mikeLundquist
quelle