wake-up-neo.com

Was ist setup.py?

Kann jemand bitte erklären, was ist setup.py und wie kann er konfiguriert oder verwendet werden?

683

setup.py ist eine Python-Datei, die Ihnen in der Regel mitteilt, dass das zu installierende Modul/Paket mit Distutils gepackt und vertrieben wurde, dem Standard für die Verteilung von Python-Modulen.

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

$ python setup.py install

und das Modul wird sich selbst installieren.

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

469
Silfverstrom

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

Erledigt ähnliche Aufgaben wie pip, easy_install usw.)


setup.py verwenden 

Beginnen wir mit einigen Definitionen:

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

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

$ 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 trotzdem verwenden möchten. Dann mach, 

$ python setup.py develop  

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


setup.py erstellen 

Wenn Sie Ihren Paketbaum haben, 

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

Dann führen Sie Folgendes in Ihrem setup.py -Skript 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 jedoch komplexer ist als der unten stehende: 

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

In diesem Fall würde Ihr setup.py folgendermaßen aussehen:

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',
           ]
)

Der long_description wird in pypi.org als README - Beschreibung Ihres Pakets verwendet. 


Und schließlich können Sie Ihr Paket jetzt nach PyPi.org hochladen, damit andere es mit pip install yourpackage installieren können. 

Als ersten Schritt fordern Sie Ihren Paketnamen und -raum in pypi mit folgendem Befehl an:

$ python setup.py register

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

$ python setup.py upload

Optional können Sie Ihr Paket auch mit GPG signieren, indem Sie

$ python setup.py --sign upload

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

259
kmario23

setup.py ist die Antwort von Python auf ein Installationsprogramm für mehrere Plattformen und eine make-Datei. 

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

Einige Pakete sind reines Python und werden nur bytekompiliert. Andere enthalten nativen Code, der einen nativen Compiler (wie gcc oder cl) und ein Python-Schnittstellenmodul (wie swig oder pyrex) erfordert.

81
whatnick

Wenn Sie das Paket "setup.py" im Stammverzeichnis heruntergeladen haben, können Sie es installieren, indem Sie es ausführen

python setup.py install

Wenn Sie ein Projekt entwickeln und sich fragen, wofür diese Datei nützlich ist, lesen Sie die Dokumentation in Python, wenn Sie das Setup-Skript schreiben

44
Pēteris Caune

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

Viele Pakete verwenden das distutils-Framework in Verbindung mit setup.py.

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

17
Ferdinand Beyer

setup.py kann in zwei Szenarien verwendet werden: Zuerst 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 (Inhalt in PKG-INFO unter Egg-info-Ordner) Name, Version, Beschreibung, andere erforderliche Installationen (normalerweise in der TXT-Datei) und einige andere Parameter. setup.cfg wird von setup.py gelesen, während das Paket erstellt wird (möglicherweise tar.gz). In Manifest.in können Sie definieren, was in Ihrem Paket enthalten sein soll. Du kannst sowieso mit setup.py eine Menge Sachen machen 

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 weiterer Befehle, die mit setup.py verwendet werden könnten. für Hilfe 

python setup.py --help-commands
14
Avichal Badaya

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 ist natürlicher, einen Paketmanager auf den Download zu verweisen, wie dies in 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. Andererseits ist jeder setup.py neuartig, da er spezifisch für das Paket ist. Es erfordert Vertrauen in die Konvention "Ich vertraue darauf, dass dieses Setup.py dieselben Befehle wie andere, die ich in der Vergangenheit verwendet habe". Das ist eine bedauerliche Steuer auf die geistige Willenskraft. 

Ich sage nicht, dass der Workflow "setup.py" weniger sicher ist als ein Paketmanager (ich verstehe, dass Pip nur die "setup.py" im Inneren ausführt), aber ich habe das Gefühl, dass es ungünstig und nervig ist. Es gibt eine Harmonie zwischen Befehlen, die sich auf dieselbe Paketmanageranwendung beziehen. Sie könnten es sogar lieben.

6
Colonel Panic

Wenn Sie ein Paket mit setup.py herunterladen, öffnen Sie Ihr Terminal (Mac, Linux) oder die Eingabeaufforderung (Windows). Verwenden Sie cd und helfen Sie mit der Tabulatortaste. Legen Sie den Pfad auf den Ordner fest, in den Sie die Datei heruntergeladen haben und wo setup.py ist:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Drücken Sie die Eingabetaste. Sie sollten etwa Folgendes sehen:

iMac:pakagefolderwithsetupfile user$

Geben Sie dann nach diesem python setup.py install ein:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Drücken Sie enter. Erledigt!

6
G M

setup.py ist eine Python-Datei wie jede andere. Es kann einen beliebigen Namen annehmen, außer nach Konvention heißt es setup.py, so dass es nicht bei jedem Skript eine andere Prozedur gibt.

Am häufigsten wird setup.py zur Installation eines Python-Moduls verwendet, zu anderen Zwecken des Servers:

Module:

Vielleicht ist dies die bekannteste Verwendung von setup.py in Modulen. Obwohl sie mit pip installiert werden können, enthielten ältere Python-Versionen standardmäßig pip nicht und mussten separat installiert werden. 

Wenn Sie ein Modul installieren wollten, aber pip nicht installieren wollten, war die einzige Alternative die Installation des Moduls aus der setup.py-Datei. Dies könnte über python setup.py install erreicht werden. Dies würde das Python-Modul im Wurzelverzeichnis installieren (ohne pip, easy_install ect).

Diese Methode wird häufig verwendet, wenn pip fehlschlägt. Wenn zum Beispiel die korrekte Python-Version des gewünschten Pakets nicht über pipperhaps verfügbar ist, weil es nicht mehr gepflegt wird, würde das Herunterladen der Quelle und das Ausführen von python setup.py install dasselbe ausführen, außer wenn kompilierte Binärdateien erforderlich sind (dies wird jedoch ignoriert.) die Python-Version, sofern nicht ein Fehler zurückgegeben wird).

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

Python-Erweiterungen erstellen:

Wenn ein Modul erstellt wurde, kann es mit einem distutils-Setup-Skript in ein für die Verteilung bereites Modul konvertiert werden. Einmal gebaut, können diese mit dem obigen Befehl installiert werden.

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

Es wird wiederum setup.py zur Vereinfachung der Verwendung und nach Konvention benannt, kann jedoch einen beliebigen Namen annehmen.

Cython:

Eine andere bekannte Verwendung von setup.py-Dateien umfasst 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 python setup.py build kompiliert werden.

Cx_Freeze:

Ein anderes Modul, das ein Setup-Skript benötigt, ist cx_Freeze. Dadurch wird das Python-Skript in ausführbare Dateien konvertiert. Dadurch können viele Befehle wie Beschreibungen, Namen, Symbole, Pakete eingeschlossen, ect ausgeschlossen und einmal ausgeführt werden, um eine verteilbare Anwendung zu erzeugen. 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 python setup.py build kompiliert werden.

Was ist eine setup.py-Datei?

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

Bei der Verteilung eines Pakets sollte es nur ein Setup-Skript enthalten. Es ist jedoch nicht ungewöhnlich, mehrere in einem Setup-Skript zusammenzufassen. Beachten Sie, dass dies oft distutils ist, aber nicht immer (wie ich in meinem letzten Beispiel gezeigt habe). Um sich daran zu erinnern, werden lediglich Python-Pakete/-Skripte konfiguriert. 

Es nimmt den Namen, sodass derselbe Befehl immer beim Erstellen oder Installieren verwendet werden kann.

1
Simon

Zur Vereinfachung wird setup.py als "__main__" ausgeführt, wenn Sie die install-Funktionen aufrufen die anderen erwähnten Antworten. In setup.py sollten Sie alles für die Installation Ihres Pakets einfügen.

Gemeinsame setup.py-Funktionen

In den folgenden zwei 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 ... angeben. Am wichtigsten ist jedoch, dass Sie mit dieser Funktion andere Funktionen installieren können, wenn sie ordnungsgemäß verpackt sind. Siehe diese Webseite für ein Beispiel für setuptools.setup

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

Benutzerdefinierte Funktionen

In einer idealen Welt würde setuptools.setup alles für Sie erledigen. Leider ist dies nicht immer der Fall. Manchmal müssen Sie bestimmte Dinge tun, z. B. das Installieren von Abhängigkeiten mit dem Befehl subprocess , um das System, auf dem Sie die Installation ausführen, in den richtigen Zustand für Ihr Paket zu bringen. Versuchen Sie dies zu vermeiden, diese Funktionen werden verwirrend und unterscheiden sich häufig zwischen OS und sogar distribution .

0
user4757074