it-swarm.com.de

setup.py Beispiele?

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 sie selbst zu erstellen (mit dem Ziel, eine Fedora-RPM-Datei zu erstellen).

Könnte das ab o. Gemeinschaft mich auf einige gute Beispiele hinweisen?

67
jedierikb

Komplette Anleitung zum Schreiben setup.py Skripte hier . (mit einigen Beispielen)

Wenn Sie ein reales Beispiel möchten, könnte ich Sie auf die setup.py Drehbücher einiger wichtiger Projekte. Djangos ist hier , Pyglets ist hier . Sie können einfach die Quelle anderer Projekte nach einer Datei mit dem Namen setup.py durchsuchen, um weitere Beispiele zu erhalten.

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

52
Rafe Kettler

Möglicherweise finden Sie das Per Anhalter durchgeführte Handbuch zum Verpacken hilfreich, auch wenn es unvollständig ist. Ich würde mit dem Schnellstart-Tutorial beginnen. Schauen Sie sich auch einfach die Python -Pakete im Python Package Index an. Laden Sie einfach den Tarball herunter, entpacken Sie ihn und werfen Sie einen Blick auf die setup.py Datei. Oder noch besser, schauen Sie sich nur Pakete an, in denen ein öffentliches Quellcode-Repository aufgeführt ist, beispielsweise eines, das auf GitHub oder BitBucket gehostet wird. Sie sind verpflichtet, auf der Titelseite auf eine zu stoßen.

Mein letzter Vorschlag ist, es 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 einfach, ein neues Paket auf PyPI zu erstellen und es ebenso einfach zu entfernen. Erstellen Sie also ein Dummy-Paket und spielen Sie herum.

29
gotgenes

LESEN SIE DIESE ZUERST https://packaging.python.org/en/latest/current.html

Empfehlungen zum Installationstool

  1. Installiere mit pip Python Pakete von PyPI.
  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 voll integrierte plattformübergreifende Software-Stacks verwalten möchten, ziehen Sie Buildout (in erster Linie für die Webentwicklungs-Community) oder Hashdist oder Conda (beide in erster Linie für die Wissenschafts-Community) in Betracht.

Empfehlungen für das Verpackungswerkzeug

  1. Verwenden Sie setuptools, um Projekte zu definieren und Quelldistributionen 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 Twine, um Distributionen auf PyPI hochzuladen.

Diese Antwort ist veraltet, und tatsächlich gibt es einen Rettungsplan für python package world called

räder Weg

Ich qoute pythonwheels.com hier:

Was sind Räder?

Räder sind der neue Standard der python Distribution 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 für Tests und eine kontinuierliche Integration.
  5. Erstellt im Rahmen der Installation .pyc-Dateien, um sicherzustellen, dass sie mit dem verwendeten python -Interpreter übereinstimmen.
  6. Konsistentere Installationen auf allen Plattformen und Maschinen.

Die vollständige Geschichte der richtigen python Verpackung (und über Räder) wird unter packaging.python.org behandelt


conda way

Für wissenschaftliches Rechnen (dies wird auch auf packaging.python.org empfohlen, siehe oben) würde ich die Verwendung von CONDA-Paketierung in Betracht ziehen, das als Drittanbieter-Service angesehen werden kann, der auf PyPI- und Pip-Tools aufbaut. Es funktioniert auch hervorragend beim Einrichten einer eigenen Version von binstar , sodass ich mir vorstellen kann, dass es den Trick für ein ausgefeiltes benutzerdefiniertes Enterprise-Paketmanagement kann.

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

conda installieren

und leistungsstarke virtuelle Umgebungserweiterung.


eier Weg

Diese Option stand im Zusammenhang mit python-distribute.org und ist (ebenso wie die Site) veraltet. Lassen Sie mich also auf eines der gebrauchsfertigen und dennoch kompakten setup.py-Beispiele verweisen, die mir gefallen: =

  • Ein sehr praktisches Beispiel/eine Implementierung zum Mischen von Skripten und einzelnen python Dateien in setup.py ist hier
  • Noch besser von hyperopt

Dieses Zitat stammt aus der Anleitung zum Zustand von setup.py und gilt weiterhin:

  • setup.py weg!
  • destillate weg!
  • verteilen gegangen!
  • pip und virtualenv bleiben hier!
  • eier ... weg!

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

  • Räder !

Ich würde empfehlen, sich mit Verpackungs-Ökosystem (aus der Anleitung von gotgenes) vertraut zu machen, bevor Sie das sinnlose Einfügen von Kopien versuchen.

Die meisten Beispiele im Internet beginnen mit

from distutils.core import setup

dies unterstützt jedoch beispielsweise nicht das Erstellen eines Egg -Python-Setups. py bdist_Egg (sowie einige andere old -Funktionen ), die in verfügbar waren

from setuptools import setup

Und der Grund ist, dass sie veraltet sind .

Nun nach dem Leitfaden

Warnung

Bitte verwenden Sie das Distribute-Paket anstelle des Setuptools-Pakets, da es in diesem Paket Probleme gibt, die behoben werden können und werden.

veraltete setuptools sollen durch distutils2 ersetzt werden, was "Teil der Standardbibliothek in Python 3.3" sein wird. Ich muss sagen, dass ich setuptools und eggs mochte und nicht Trotzdem war er von der Bequemlichkeit von distutils2 völlig überzeugt

pip install Distutils2

und zu installieren

python -m distutils2.run install

PS

Verpackung war nie trivial (man lernt dies, indem man versucht, eine neue zu entwickeln), daher gehe ich davon aus, dass viele Dinge aus gutem Grund geschehen sind. Ich hoffe es nur dieses Mal wird sein ist richtig gemacht.

24

Ich empfehle das setup.py des Python Packaging User Guide Beispielprojekts.

Das Python Packaging User Guide "soll als maßgebliche Ressource für das Packen, Veröffentlichen und Installieren von Python Distributionen mit aktuellen Tools dienen".

5
Razzi Abuissa

Hier finden Sie das einfachste Beispiel für die Verwendung von distutils und setup.py:

https://docs.python.org/2/distutils/introduction.html#distutils-simple-example

Dies setzt voraus, dass sich Ihr gesamter Code in einer einzigen Datei befindet, und erklärt, wie ein Projekt gepackt wird, das ein einzelnes Modul enthält.

3
Akshar Raaj

Schauen Sie sich dieses vollständige Beispiel an https://github.com/marcindulak/python-mycli eines kleinen python Paketes. Es basiert auf den Paketempfehlungen 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 wie folgt 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
3
marcindulak

Minimalbeispiel

from setuptools import setup, find_packages


setup(name='foo',
      version='1.0',
      packages=find_packages(),
      )
2
jozo