Kann jemand bitte erklären, was setup.py
ist und wie es konfiguriert oder verwendet werden kann?
Kann jemand bitte erklären, was setup.py
ist und wie es konfiguriert oder verwendet werden kann?
Antworten:
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 .
pip
verwendet setup.py, um Ihr Modul zu installieren. Vermeiden Sie es anzurufensetup.py
direkt .
https://docs.python.org/3/installing/index.html#installing-index
setup.py
Datei erläutert wird .
Es ist hilfreich, ein Python-Paket foo
auf Ihrem Computer zu installieren (kann auch vorhanden sein virtualenv
), damit Sie das Paket foo
aus anderen Projekten und auch aus [I] Python-Eingabeaufforderungen importieren können .
Es macht den ähnlichen Job pip
, easy_install
usw.,
Verwenden von setup.py
Beginnen wir mit einigen Definitionen:
Paket - Ein Ordner / Verzeichnis, das eine __init__.py
Datei enthält .
Modul - Eine gültige Python-Datei mit der .py
Erweiterung.
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.py
Skript 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='foomail@foo.com',
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.py
in diesem Fall wie folgt:
from setuptools import setup
setup(
name='foo',
version='1.0',
description='A useful module',
author='Man Foo',
author_email='foomail@foo.com',
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='foomail@foo.com',
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_description
wird 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.py
aus einem realen Projekt:torchvision-setup.py
requests
) hat dieses Projekt, um explizit ein gutes Beispiel für setup.py - github.com/kennethreitz/setup.py
setup.py
ist Pythons Antwort auf ein Installationsprogramm und eine make
Datei 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 gcc
oder cl
) und ein Python-Schnittstellenmodul (wie swig
oder pyrex
) erforderlich sind .
python setup.py install
wird tatsächlich python setup.py build
zuerst ausgeführt (Sie müssen sie also nur in bestimmten Fällen separat ausführen). Ich glaube, muss make
immer manuell ausgeführt werden, bevor es ausgeführt wird make install
.
make
keine spezifischen Parameter (oder Reihenfolge): Es liegt ganz beim Ersteller, Makefile
welche "Ziele" verfügbar sind (und in welcher Reihenfolge sie aufgerufen werden müssen). Da Bare Makefile
s (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 make
vorher explizit ausführen müssen make install
oder nicht.
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
setup.py
ist 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 distutils
Framework in Verbindung mit setup.py
.
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
python setup.py --help-commands
. Sehr nützlich beim Stöbern in der setup.py.
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!
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.
setup.py
ist eine Python-Datei wie jede andere. Es kann einen beliebigen Namen annehmen, es sei denn, es wird konventionell benannt, setup.py
damit es nicht bei jedem Skript eine andere Prozedur gibt.
Am häufigsten setup.py
wird verwendet, um ein Python-Modul zu installieren, aber Server für andere Zwecke:
Module:
Vielleicht ist dies die bekannteste Verwendung setup.py
in Modulen. Obwohl sie mit installiert werden können pip
, waren alte Python-Versionen pip
standardmäßig nicht enthalten und mussten separat installiert werden.
Wenn Sie ein Modul installieren wollten, aber nicht installieren wollten, pip
bestand die einzige Alternative darin, das Modul aus einer setup.py
Datei 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_install
ect).
Diese Methode wird häufig verwendet, wenn pip
ein Fehler auftritt. Wenn beispielsweise die richtige Python-Version des gewünschten Pakets pip
mö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.py
ist 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.py
nach Benutzerfreundlichkeit und Konvention benannt, kann aber jeden Namen annehmen.
Cython:
Eine weitere bekannte Verwendung von setup.py
Dateien 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.py
Datei?
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, distutils
aber 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.
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.
In den folgenden beiden Abschnitten werden zwei Dinge erläutert, die viele setup.py-Module haben.
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/",]
In einer idealen Welt setuptools.setup
wü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 .