web-dev-qa-db-fra.com

Exemples setup.py?

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 le mien (dans le but de créer un fichier Fedora rpm).

Le s.o. communauté me pointe vers de bons exemples?

67
jedierikb

Solution complète d'écriture setup.py scripts ici . (avec quelques exemples)

Si vous souhaitez un exemple concret, je pourrais vous indiquer le setup.py scripts 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 de tutoriel que j'ai donné a ceux-là. Ce sont plus complexes, mais aussi plus pratiques.

52
Rafe Kettler

Vous pouvez trouver le Guide de l’emballage de HitchHiker utile, même s’il est incomplet. Je commencerais par le tutoriel de démarrage rapide . Essayez également de simplement parcourir Python sur le Index de paquet Python) . Téléchargez simplement l'archive, décompressez-la et jetez un coup d'œil au setup.py fichier. Ou, mieux encore, ne cherchez que des packages qui répertorient un référentiel de code source public tel que celui hébergé sur GitHub ou BitBucket. Vous en rencontrerez sûrement un en première page.

Ma dernière suggestion est d’y aller et d’en essayer un; n'ayez pas peur d'échouer. Je ne comprenais vraiment pas jusqu'à ce que je commence à les fabriquer moi-même. Il est simple de créer un nouveau paquet sur PyPI et tout aussi facile de le supprimer. Alors, créez un paquet factice et jouez.

29
gotgenes

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

Recommandations relatives aux outils d'installation

  1. Utilisez pip pour installer Python de PyPI.
  2. Utilisez virtualenv ou pyvenv pour isoler les dépendances spécifiques à l’application d’une installation partagée Python.
  3. Utilisez la molette pip pour créer un cache des distributions de roues, afin d'accélérer les installations ultérieures.
  4. Si vous souhaitez gérer des piles de logiciels multiplates-formes entièrement intégrées, envisagez de construire (principalement sur la communauté du développement Web) ou sur Hashdist ou conda (les deux principalement sur la communauté scientifique).

Recommandations relatives aux 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 Wheel pour créer des roues. Ceci est particulièrement utile si votre projet contient des extensions binaires.
  3. Utilisez la ficelle pour télécharger les distributions sur PyPI.

Cette réponse a vieilli et il existe effectivement un plan de secours pour python

chemin des roues

Je qoute pythonwheels.com ici:

Que sont les roues?

Les roues sont le nouveau standard de distribution python) et sont destinées à remplacer les œufs. La prise en charge est proposée sous forme de pip> = 1,4 et de setuptools> = 0,8.

Avantages des roues

  1. Installation plus rapide pour les packages purs python et d’extension C native).
  2. Evite 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ète python utilisé).
  6. Des installations plus cohérentes sur les plates-formes et les machines.

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


conda way

Pour le calcul scientifique (ceci est également recommandé sur packaging.python.org, voir ci-dessus), je envisagerais d'utiliser emballage CONDA , qui peut être considéré comme un service tiers construit au-dessus des outils PyPI et pip. Cela fonctionne également très bien sur la configuration de votre propre version de binstar , alors j'imagine que cela peut faire l'affaire pour la gestion sophistiquée de packages d'entreprise personnalisés.

Conda peut être installé dans un dossier d’utilisateur (sans autorisation du super utilisateur) et fonctionne comme par magie avec

conda installer

et puissant développement virtuel env.


manière d'oeufs

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

  • Un exemple/implémentation très pratique de mélange de scripts et de fichiers simples python dans setup.py donne ici
  • Encore mieux 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!
  • les œufs ... sont partis!

J'ajoute un autre point (de moi)

  • roues !

Je recommanderais de comprendre un peu packaging -osystem (du guide pointé par gotgenes) avant de tenter un copier-coller aveugle.

La plupart des exemples sur Internet commencent par

from distutils.core import setup

mais ceci par exemple ne supporte pas la construction d'un oeuf python setup.py bdist_Egg (ainsi que quelques autres vieux ), 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 paquet Distribuer plutôt que le paquet Setuptools car il y a des problèmes dans ce paquet qui peuvent et ne seront pas résolus.

obsolètes setuptools doivent être remplacés par distutils2 , qui "fera partie de la bibliothèque standard dans Python 3.3". Je dois dire que j'ai aimé setuptools et egg et que je n'ai pas complètement convaincu par la commodité de distutils2.

pip install Distutils2

et installer

python -m distutils2.run install

PS

L'emballage n'a jamais été trivial (on l'apprend en essayant d'en développer un nouveau), alors je suppose que beaucoup de choses ont disparu pour de bonnes raisons. J'espère juste que cette fois sera est fait correctement.

24
Yauhen Yakimovich

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

Le Python Guide de l’emballage ") a pour objectif d’être la ressource faisant autorité pour la mise en package, la publication et l’installation Python à l’aide des outils actuels".

5
Razzi Abuissa

Vous trouverez ici l'exemple le plus simple possible d'utilisation de distutils et de setup.py:

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

Cela suppose que tout votre code se trouve dans un seul fichier et indique comment conditionner un projet contenant un seul module.

3
Akshar Raaj

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

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

#!/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écifications RPM qui suit plus ou moins les consignes d'emballage de 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
3
marcindulak

exemple minimal

from setuptools import setup, find_packages


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