exemples setup.py?

88

Après avoir étudié cette page:

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

J'espère trouver des fichiers setup.py à étudier afin de créer les miens (dans le but de créer un fichier rpm fedora).

La communauté so pourrait-elle m'indiquer de bons exemples?

jedierikb
la source

Réponses:

60

Procédure pas à pas complète de l'écriture de setup.pyscripts ici . (avec quelques exemples)

Si vous souhaitez un exemple concret, je pourrais vous orienter vers les setup.pyscripts de quelques projets majeurs. Django est ici , pyglet est ici . Vous pouvez simplement parcourir la source d'autres projets pour un fichier nommé setup.py pour plus d'exemples.

Ce ne sont pas des exemples simples; le lien du didacticiel que j'ai donné en contient. Celles-ci sont plus complexes, mais aussi plus pratiques.

Rafe Kettler
la source
30

Vous trouverez peut-être le Guide de l' auto-stop sur l'emballage utile, même s'il est incomplet. Je commencerais par le didacticiel de démarrage rapide . Essayez également de parcourir simplement les packages Python dans l' index des packages Python . Téléchargez simplement l'archive tar, décompressez-la et jetez un œil au setup.pyfichier. Ou mieux encore, ne cherchez qu'à parcourir les packages qui répertorient un référentiel de code source public tel que celui hébergé sur GitHub ou BitBucket. Vous êtes obligé d'en rencontrer un sur la première page.

Ma dernière suggestion est de simplement y aller et d'essayer d'en faire un; n'ayez pas peur d'échouer. Je ne l'ai vraiment pas compris avant de commencer à les fabriquer moi-même. Il est trivial de créer un nouveau package sur PyPI et tout aussi simple de le supprimer. Alors, créez un package factice et jouez.

gotgenes
la source
26

LISEZ CECI EN PREMIER https://packaging.python.org/en/latest/current.html

Recommandations d'outils d'installation

  1. Utilisez pip pour installer les packages Python à partir de PyPI.
  2. Utilisez virtualenv ou pyvenv pour isoler les dépendances spécifiques à une application d'une installation Python partagée.
  3. Utilisez pip wheel pour créer un cache des distributions de roues, dans le but> d'accélérer les installations ultérieures.
  4. Si vous recherchez la gestion de piles de logiciels multiplateformes entièrement intégrées, envisagez la construction (principalement axée sur la communauté de développement Web) ou Hashdist, ou conda (tous deux principalement axés sur la communauté scientifique).

Recommandations d'outils d'emballage

  1. Utilisez setuptools pour définir des projets et créer des distributions source.
  2. Utilisez l'extension bdist_wheel setuptools disponible dans le projet de roue pour créer des roues. Ceci est particulièrement avantageux si votre projet contient des extensions binaires.
  3. Utilisez de la ficelle pour télécharger les distributions vers PyPI.

Cette réponse a vieilli, et il existe en effet un plan de sauvetage pour le monde de l'emballage python appelé

façon roues

Je qoute pythonwheels.com ici:

Que sont les roues?

Les roues sont le nouveau standard de la distribution python et sont destinées à remplacer les œufs. Le support est offert dans pip> = 1.4 et setuptools> = 0.8.

Avantages des roues

  1. Installation plus rapide pour les packages d'extension Python pur et C natif
  2. Évite l'exécution de code arbitraire pour l'installation. (Évite setup.py)
  3. L'installation d'une extension C ne nécessite pas de compilateur sous Windows ou OS X.
  4. Permet une meilleure mise en cache pour les tests et l'intégration continue.
  5. Crée des fichiers .pyc dans le cadre de l'installation pour s'assurer qu'ils correspondent à l'interpréteur python utilisé.
  6. Installations plus cohérentes sur les plates-formes et les machines.

L'histoire complète de l'empaquetage correct de python (et des roues) est couverte sur packaging.python.org


chemin conda

Pour le calcul scientifique (ceci est également recommandé sur packaging.python.org, voir ci-dessus), j'envisagerais d' utiliser l' empaquetage CONDA qui peut être vu comme un service tiers construit au-dessus des outils PyPI et pip. Cela fonctionne également très bien pour configurer votre propre version de binstar, donc j'imagine qu'il peut faire l'affaire pour une gestion sophistiquée de paquets d'entreprise personnalisés.

Conda peut être installé dans un dossier utilisateur (aucune autorisation de super utilisateur) et fonctionne comme par magie avec

installation de conda

et une puissante extension d'environnement virtuel.


manière d'oeufs

Cette option était liée à python-distribute.org et est plus obsolète (ainsi que le site), alors laissez-moi vous indiquer l'un des exemples setup.py prêts à l'emploi mais compacts que j'aime:

  • Un exemple / implémentation très pratique de mélange de scripts et de fichiers python uniques dans setup.py est donné ici
  • Encore meilleur de hyperopt

Cette citation est tirée du guide sur l' état de setup.py et s'applique toujours:

  • setup.py est parti!
  • distutils parti!
  • distribuer parti!
  • pip et virtualenv ici pour rester!
  • oeufs ... partis!

J'ajoute un point de plus (de moi)

  • roues !

Je recommanderais d'avoir une certaine compréhension de l' écosystème de l' emballage (à partir du guide indiqué par gotgenes) avant de tenter un copier-coller sans réfléchir.

La plupart des exemples sur Internet commencent par

from distutils.core import setup

mais cela, par exemple, ne prend pas en charge la construction d'un egg python setup.py bdist_egg (ainsi que d'autres anciennes fonctionnalités), qui étaient disponibles dans

from setuptools import setup

Et la raison en est qu'ils sont obsolètes .

Maintenant selon le guide

Attention

Veuillez utiliser le package Distribute plutôt que le package Setuptools car il y a des problèmes dans ce package qui peuvent et ne seront pas résolus.

Les outils setuptools obsolètes doivent être remplacés par distutils2 , qui "fera partie de la bibliothèque standard de Python 3.3". Je dois dire que j'ai aimé setuptools et les œufs et que je n'ai pas encore été complètement convaincu par la commodité de distutils2. Cela requiert

pip install Distutils2

et installer

python -m distutils2.run install

PS

L'emballage n'a jamais été anodin (on apprend cela en essayant d'en développer un nouveau), donc je suppose que beaucoup de choses se sont passées pour une raison. J'espère juste que cette fois, ce sera fait correctement.

Yauhen Yakimovich
la source
4
alors, comment cette réponse a-t-elle vieilli? distutils2 est-il venu avec python 3.3? setuptools est-il mort et dépérit-il?
Capi Etheriel
Pouvez-vous donner la référence au "guide sur l'état de setup.py"? Parce que ce "setup.py est parti!" est faux. Nous sommes en 2017 et setup.py est toujours là.
karantan
11

Exemple minimal

from setuptools import setup, find_packages


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

Plus d'informations dans la documentation

jozo
la source
5

Regardez cet exemple complet https://github.com/marcindulak/python-mycli d'un petit package python. Il est basé sur les recommandations d'emballage de https://packaging.python.org/en/latest/distributing.html , utilise setup.py avec distutils et montre en outre comment créer des packages RPM et deb.

Le fichier setup.py du projet est inclus ci-dessous (voir le dépôt pour la source complète):

#!/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,
      )

et et le fichier de spécification RPM qui suit plus ou moins les directives d'emballage Fedora / EPEL peut ressembler à:

# 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
la source
2
s'il vous plaît, au lieu de simplement copier / coller des liens, essayez d'extraire la partie significative qui répond réellement à la question
fredmaggiowski
5

Je recommande le setup.py de l' exemple de projet du Python Packaging User Guide .

Le Guide de l'utilisateur de Python Packaging "vise à être la ressource faisant autorité sur la façon de conditionner, publier et installer des distributions Python à l'aide des outils actuels".

Razzi Abuissa
la source
2

Voici l'utilitaire que j'ai écrit pour générer un simple fichier setup.py (modèle) avec des commentaires et des liens utiles. J'espère que ce sera utile.

Installation

sudo pip install setup-py-cli

Usage

Pour générer le fichier setup.py , tapez simplement le terminal.

setup-py

Le fichier setup.py devrait maintenant apparaître dans le répertoire courant.

Généré 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=[]  
)

Contenu du setup.py généré :

  • nom du package rempli automatiquement en fonction du nom du répertoire actuel
  • quelques domaines de base à remplir.
  • clarifier les commentaires et les liens vers des ressources utiles.
  • automatiquement inséré une description de README.md ou une chaîne vide s'il n'y a pas de README.md .

Voici le lien vers le référentiel. Remplissez gratuitement pour améliorer la solution.

voilalex
la source