setup.py Beispiele?

87

Nach dem Studium dieser Seite:

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

Ich hoffe, einige setup.py-Dateien zu finden, die ich studieren kann, um meine eigenen zu erstellen (mit dem Ziel, eine Fedora-RPM-Datei zu erstellen).

Könnte mich die Community auf einige gute Beispiele hinweisen?

jedierikb
quelle

Antworten:

59

Vollständige Anleitung zum Schreiben von setup.pySkripten hier . (mit einigen Beispielen)

Wenn Sie ein reales Beispiel möchten, könnte ich Sie auf die setup.pySkripte einiger großer Projekte hinweisen . Django ist hier , Pyglet ist hier . Sie können einfach in der Quelle anderer Projekte nach einer Datei mit dem Namen setup.py suchen, um weitere Beispiele zu finden.

Dies sind keine einfachen Beispiele; Der Tutorial-Link, den ich gegeben habe, hat diese. Diese sind komplexer, aber auch praktischer.

Rafe Kettler
quelle
30

Möglicherweise ist der Per Anhalter durch die Verpackung hilfreich, auch wenn er unvollständig ist. Ich würde mit dem Schnellstart-Tutorial beginnen . Versuchen Sie auch, nur Python-Pakete im Python-Paketindex zu durchsuchen . Laden Sie einfach den Tarball herunter, packen Sie ihn aus und sehen Sie sich die setup.pyDatei an. Oder noch besser: Durchsuchen Sie nur Pakete, in denen ein öffentliches Quellcode-Repository aufgeführt ist, z. B. eines, das auf GitHub oder BitBucket gehostet wird. Sie werden auf der Titelseite auf einen stoßen.

Mein letzter Vorschlag ist, einfach zu versuchen, einen zu machen. Hab keine Angst zu scheitern. Ich habe es wirklich nicht verstanden, bis ich anfing, sie selbst zu machen. Es ist trivial, ein neues Paket auf PyPI zu erstellen und es genauso einfach zu entfernen. Erstellen Sie also ein Dummy-Paket und spielen Sie herum.

gotgenes
quelle
26

LESEN SIE DIESES ERSTE https://packaging.python.org/en/latest/current.html

Empfehlungen für das Installationstool

  1. Verwenden Sie pip, um Python-Pakete von PyPI zu installieren.
  2. Verwenden Sie virtualenv oder pyvenv, um anwendungsspezifische Abhängigkeiten von einer gemeinsam genutzten Python-Installation zu isolieren.
  3. Verwenden Sie Pip Wheel, um einen Cache mit Radverteilungen zu erstellen, um> nachfolgende Installationen zu beschleunigen.
  4. Wenn Sie nach der Verwaltung vollständig integrierter plattformübergreifender Software-Stacks suchen, sollten Sie Buildout (hauptsächlich für die Webentwicklungs-Community) oder Hashdist oder Conda (beide hauptsächlich für die wissenschaftliche Community) in Betracht ziehen.

Empfehlungen für das Verpackungstool

  1. Verwenden Sie setuptools, um Projekte zu definieren und Quellverteilungen zu erstellen.
  2. Verwenden Sie die im Radprojekt verfügbare Erweiterung bdist_wheel setuptools, um Räder zu erstellen. Dies ist besonders nützlich, wenn Ihr Projekt binäre Erweiterungen enthält.
  3. Verwenden Sie Schnur zum Hochladen von Distributionen auf PyPI.

Diese Antwort ist gealtert, und tatsächlich gibt es einen Rettungsplan für die Python-Verpackungswelt

Räder Weg

Ich qoute pythonwheels.com hier:

Was sind Räder?

Räder sind der neue Standard der Pythonverteilung und sollen Eier ersetzen. Unterstützung wird in pip> = 1.4 und setuptools> = 0.8 angeboten.

Vorteile von Rädern

  1. Schnellere Installation für reine Python- und native C-Erweiterungspakete.
  2. Vermeidet die Ausführung von willkürlichem Code für die Installation. (Vermeidet setup.py)
  3. Für die Installation einer C-Erweiterung ist kein Compiler unter Windows oder OS X erforderlich.
  4. Ermöglicht ein besseres Caching zum Testen und zur kontinuierlichen Integration.
  5. Erstellt im Rahmen der Installation .pyc-Dateien, um sicherzustellen, dass sie mit dem verwendeten Python-Interpreter übereinstimmen.
  6. Konsistentere Installationen über Plattformen und Maschinen hinweg.

Die vollständige Geschichte der korrekten Python-Verpackung (und der Räder) finden Sie unter package.python.org


Conda Weg

Für das wissenschaftliche Rechnen (dies wird auch auf package.python.org empfohlen, siehe oben) würde ich die Verwendung von CONDA-Paketen in Betracht ziehen, die als Dienst eines Drittanbieters angesehen werden können, der auf PyPI- und Pip-Tools aufbaut. Es funktioniert auch hervorragend beim Einrichten einer eigenen Version von binstar, sodass ich mir vorstellen kann, dass dies den Trick für eine ausgefeilte benutzerdefinierte Verwaltung von Unternehmenspaketen darstellt.

Conda kann in einem Benutzerordner installiert werden (keine Superuser-Berechtigungen) und funktioniert wie mit Magie

conda installieren

und leistungsstarke virtuelle Env-Erweiterung.


Eier Weg

Diese Option stand im Zusammenhang mit python-distribute.org und ist (sowie die Website) weitgehend veraltet. Lassen Sie mich Sie auf eines der gebrauchsfertigen und dennoch kompakten Beispiele für setup.py verweisen, die mir gefallen:

  • Ein sehr praktisches Beispiel / eine Implementierung zum Mischen von Skripten und einzelnen Python-Dateien in setup.py finden Sie hier
  • Noch besser von Hyperopt

Dieses Zitat stammt aus dem Handbuch zum Status von setup.py und gilt weiterhin:

  • setup.py weg!
  • distutils weg!
  • verteilen weg!
  • pip und virtualenv hier bleiben!
  • Eier ... weg!

Ich füge noch einen Punkt hinzu (von mir)

  • Räder !

Ich würde empfehlen, sich mit dem Verpackungs-Ökosystem vertraut zu machen (aus dem Leitfaden von gotgenes), bevor Sie versuchen, sinnlos zu kopieren.

Die meisten Beispiele im Internet beginnen mit

from distutils.core import setup

Dies unterstützt jedoch beispielsweise nicht das Erstellen einer Ei- Python-Datei setup.py bdist_egg (sowie einiger anderer alter Funktionen), die in verfügbar waren

from setuptools import setup

Und der Grund ist, dass sie veraltet sind .

Nun laut Anleitung

Warnung

Bitte verwenden Sie das Distribute-Paket anstelle des Setuptools-Pakets, da dieses Paket Probleme aufweist, die behoben werden können und nicht.

veraltete setuptools sollen durch distutils2 ersetzt werden , die "Teil der Standardbibliothek in Python 3.3 sein werden". Ich muss sagen, ich mochte Setuptools und Eier und war noch nicht vollständig von der Bequemlichkeit von distutils2 überzeugt. Es benötigt

pip install Distutils2

und zu installieren

python -m distutils2.run install

PS

Das Verpacken war nie trivial (man lernt dies, indem man versucht, ein neues zu entwickeln), daher gehe ich davon aus, dass viele Dinge aus gutem Grund verschwunden sind. Ich hoffe nur , es diesmal wird richtig gemacht wird .

Yauhen Yakimovich
quelle
4
Wie ist diese Antwort gealtert? kam distutils2 mit python 3.3? Sind Setuptools gestorben und verdorrt?
Capi Etheriel
Können Sie den Verweis auf "die Anleitung zum Status von setup.py" geben? Weil diese "setup.py weg!" ist falsch. Es ist 2017 und setup.py si noch hier.
Karantan
10

Minimales Beispiel

from setuptools import setup, find_packages


setup(
    name="foo",
    version="1.0",
    packages=find_packages(),
)

Weitere Infos in den Dokumenten

jozo
quelle
5

Schauen Sie sich dieses vollständige Beispiel https://github.com/marcindulak/python-mycli eines kleinen Python-Pakets an. Es basiert auf Verpackungsempfehlungen von https://packaging.python.org/en/latest/distributing.html , verwendet setup.py mit distutils und zeigt außerdem, wie RPM- und Deb-Pakete erstellt werden.

Die setup.py des Projekts ist unten enthalten (die vollständige Quelle finden Sie im Repo):

#!/usr/bin/env python

import os
import sys

from distutils.core import setup

name = "mycli"

rootdir = os.path.abspath(os.path.dirname(__file__))

# Restructured text project description read from file
long_description = open(os.path.join(rootdir, 'README.md')).read()

# Python 2.4 or later needed
if sys.version_info < (2, 4, 0, 'final', 0):
    raise SystemExit, 'Python 2.4 or later is required!'

# Build a list of all project modules
packages = []
for dirname, dirnames, filenames in os.walk(name):
        if '__init__.py' in filenames:
            packages.append(dirname.replace('/', '.'))

package_dir = {name: name}

# Data files used e.g. in tests
package_data = {name: [os.path.join(name, 'tests', 'prt.txt')]}

# The current version number - MSI accepts only version X.X.X
exec(open(os.path.join(name, 'version.py')).read())

# Scripts
scripts = []
for dirname, dirnames, filenames in os.walk('scripts'):
    for filename in filenames:
        if not filename.endswith('.bat'):
            scripts.append(os.path.join(dirname, filename))

# Provide bat executables in the tarball (always for Win)
if 'sdist' in sys.argv or os.name in ['ce', 'nt']:
    for s in scripts[:]:
        scripts.append(s + '.bat')

# Data_files (e.g. doc) needs (directory, files-in-this-directory) tuples
data_files = []
for dirname, dirnames, filenames in os.walk('doc'):
        fileslist = []
        for filename in filenames:
            fullname = os.path.join(dirname, filename)
            fileslist.append(fullname)
        data_files.append(('share/' + name + '/' + dirname, fileslist))

setup(name='python-' + name,
      version=version,  # PEP440
      description='mycli - shows some argparse features',
      long_description=long_description,
      url='https://github.com/marcindulak/python-mycli',
      author='Marcin Dulak',
      author_email='[email protected]',
      license='ASL',
      # https://pypi.python.org/pypi?%3Aaction=list_classifiers
      classifiers=[
          'Development Status :: 1 - Planning',
          'Environment :: Console',
          'License :: OSI Approved :: Apache Software License',
          'Natural Language :: English',
          'Operating System :: OS Independent',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.4',
          'Programming Language :: Python :: 2.5',
          'Programming Language :: Python :: 2.6',
          'Programming Language :: Python :: 2.7',
          'Programming Language :: Python :: 3',
          'Programming Language :: Python :: 3.2',
          'Programming Language :: Python :: 3.3',
          'Programming Language :: Python :: 3.4',
      ],
      keywords='argparse distutils cli unittest RPM spec deb',
      packages=packages,
      package_dir=package_dir,
      package_data=package_data,
      scripts=scripts,
      data_files=data_files,
      )

und und RPM-Spezifikationsdatei, die mehr oder weniger den Fedora / EPEL-Verpackungsrichtlinien entspricht, können folgendermaßen aussehen:

# Failsafe backport of Python2-macros for RHEL <= 6
%{!?python_sitelib: %global python_sitelib      %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
%{!?python_sitearch:    %global python_sitearch     %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%{!?python_version: %global python_version      %(%{__python} -c "import sys; sys.stdout.write(sys.version[:3])")}
%{!?__python2:      %global __python2       %{__python}}
%{!?python2_sitelib:    %global python2_sitelib     %{python_sitelib}}
%{!?python2_sitearch:   %global python2_sitearch    %{python_sitearch}}
%{!?python2_version:    %global python2_version     %{python_version}}

%{!?python2_minor_version: %define python2_minor_version %(%{__python} -c "import sys ; print sys.version[2:3]")}

%global upstream_name mycli


Name:           python-%{upstream_name}
Version:        0.0.1
Release:        1%{?dist}
Summary:        A Python program that demonstrates usage of argparse
%{?el5:Group:       Applications/Scientific}
License:        ASL 2.0

URL:            https://github.com/marcindulak/%{name}
Source0:        https://github.com/marcindulak/%{name}/%{name}-%{version}.tar.gz

%{?el5:BuildRoot:   %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)}
BuildArch:      noarch

%if 0%{?suse_version}
BuildRequires:      python-devel
%else
BuildRequires:      python2-devel
%endif


%description
A Python program that demonstrates usage of argparse.


%prep
%setup -qn %{name}-%{version}


%build
%{__python2} setup.py build


%install
%{?el5:rm -rf $RPM_BUILD_ROOT}
%{__python2} setup.py install --skip-build --prefix=%{_prefix} \
   --optimize=1 --root $RPM_BUILD_ROOT


%check
export PYTHONPATH=`pwd`/build/lib
export PATH=`pwd`/build/scripts-%{python2_version}:${PATH}
%if 0%{python2_minor_version} >= 7
%{__python2} -m unittest discover -s %{upstream_name}/tests -p '*.py'
%endif


%clean
%{?el5:rm -rf $RPM_BUILD_ROOT}


%files
%doc LICENSE README.md
%{_bindir}/*
%{python2_sitelib}/%{upstream_name}
%{?!el5:%{python2_sitelib}/*.egg-info}


%changelog
* Wed Jan 14 2015 Marcin Dulak <[email protected]> - 0.0.1-1
- initial version
Marcindulak
quelle
2
Bitte, anstatt einfach Links zu kopieren / einzufügen, versuchen Sie, den wesentlichen Teil zu extrahieren, der die Frage tatsächlich beantwortet
Fredmaggiowski
5

Ich empfehle die Datei setup.py des Beispielprojekts des Python Packaging-Benutzerhandbuchs .

Das Python Packaging-Benutzerhandbuch soll "die maßgebliche Ressource zum Packen, Veröffentlichen und Installieren von Python-Distributionen mit aktuellen Tools sein".

Razzi Abuissa
quelle
2

Hier ist das Dienstprogramm, das ich geschrieben habe, um eine einfache setup.py- Datei (Vorlage) mit nützlichen Kommentaren und Links zu generieren . Ich hoffe, es wird nützlich sein.

Installation

sudo pip install setup-py-cli

Verwendung

Um die Datei setup.py zu generieren, geben Sie einfach das Terminal ein.

setup-py

Jetzt sollte die Datei setup.py im aktuellen Verzeichnis erscheinen.

Generierte setup.py

from distutils.core import setup
from setuptools import find_packages
import os


# User-friendly description from README.md
current_directory = os.path.dirname(os.path.abspath(__file__))
try:
    with open(os.path.join(current_directory, 'README.md'), encoding='utf-8') as f:
        long_description = f.read()
except Exception:
    long_description = ''

setup(
    # Name of the package
    name=<name of current directory>,

    # Packages to include into the distribution
    packages=find_packages('.'), 

    # Start with a small number and increase it with every change you make
    # https://semver.org
    version='1.0.0',

    # Chose a license from here: https://help.github.com/articles/licensing-a-repository
    # For example: MIT
    license='',

    # Short description of your library
    description='',

    # Long description of your library
    long_description = long_description,
    long_description_context_type = 'text/markdown',

    # Your name
    author='', 

    # Your email
    author_email='',     

    # Either the link to your github or to your website
    url='',

    # Link from which the project can be downloaded
    download_url='',

    # List of keyword arguments
    keywords=[],

    # List of packages to install with this one
    install_requires=[],

    # https://pypi.org/classifiers/
    classifiers=[]  
)

Inhalt der generierten setup.py :

  • automatisch erfüllter Paketname basierend auf dem Namen des aktuellen Verzeichnisses.
  • einige grundlegende Felder zu erfüllen.
  • Klärung von Kommentaren und Links zu nützlichen Ressourcen.
  • automatisch eingefügte Beschreibung aus README.md oder eine leere Zeichenfolge, wenn keine README.md vorhanden ist .

Hier ist der Link zum Repository. Füllen Sie frei, um die Lösung zu verbessern.

voilalex
quelle