setup.py des exemples?

après avoir étudié cette page:

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

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

Could the S. O. la communauté me montre-t-elle quelques bons exemples?

61
demandé sur jedierikb 2011-01-19 23:42:24

6 réponses

un parcours Complet de l'écriture setup.py scripts ici . (avec quelques exemples)

si vous voulez un exemple réel, je peux vous montrer les scripts setup.py de quelques grands projets. 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 n'est pas simple exemples; le tutoriel lien que j'ai donné a ceux. Ceux-ci sont plus complexes, mais aussi plus pratique.

45
répondu Rafe Kettler 2016-07-24 09:22:13

vous pouvez trouver utile le Guide de L'auto-stoppeur pour L'emballage , même s'il est incomplet. Je commencerais avec le tutoriel de démarrage rapide . Essayez aussi simplement de parcourir les paquets Python sur le Python Package Index . Il suffit de télécharger l'archive, de la déballer et de consulter le fichier setup.py . Ou encore mieux, ne cherchez que les paquets qui listent un dépôt de code source public comme celui hébergé sur GitHub ou BitBucket. Vous allez en rencontrer un en première page.

Ma dernière suggestion est d'aller juste pour elle et essayer de faire un; n'ayez pas peur d'échouer. Je ne l'ai vraiment pas compris jusqu'à ce que je commence à les faire moi-même. Il est trivial de créer un nouveau paquet sur PyPI et tout aussi facile de le supprimer. Donc, créer un paquet et jouer.

29
répondu gotgenes 2014-12-15 19:15:28

lisez D'abord https://packaging.python.org/en/latest/current.html

Recommandations Concernant L'Outil D'Installation

  1. utilisez pip pour installer les paquets Python de PyPI.
  2. utilisez virtualenv, ou pyvenv pour isoler les dépendances spécifiques à une application d'une installation Python partagée.
  3. utilisez la roue pip pour créer un cache de distributions de roues, dans le but d'accélérer les installations subséquentes.
  4. si vous êtes à la recherche de la gestion des piles logicielles multiplateformes entièrement intégrées, envisagez buildout (principalement axé sur la communauté de développement web) ou Hashdist, ou conda (tous deux principalement axé sur la communauté scientifique).

Recommandations Relatives Aux Outils D'Emballage

  1. Utilisation setuptools définir des projets et créer des Distributions de sources.
  2. utilisez l'extension bdist_wheel setuptools pour créer des roues. Ceci est particulièrement bénéfique si votre projet contient des extensions binaires.
  3. utiliser de la ficelle pour télécharger les distributions vers PyPI.

cette anwser a vieilli, et en effet il existe un plan de sauvetage pour Python packaging world appelé

à roulettes

I qoute pythonwheels.com ici:

que sont les roues?

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

avantages des roues

  1. installation plus rapide pour les paquets d'extension Python pur et natif C.
  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 sur Windows ou OS X.
  4. permet une meilleure mise en cache pour les essais et intégration.
  5. crée .fichiers pyc dans le cadre de l'installation pour assurer ils correspondent à l'interpréteur python utilisé.
  6. installation plus cohérente à travers les plates-formes et les machines.

l'histoire complète de l'emballage python correct (et sur les roues) est couverte à packaging.python.org


conda façon

pour l'informatique scientifique (ceci est également recommandé le packaging.python.org, voir ci-dessus) j'envisagerais d'utiliser CONDA packaging qui peut être considéré comme un service tiers construit sur les outils PyPI et pip. Il fonctionne également très bien sur la mise en place de votre propre version de binstar donc j'imagine qu'il peut faire le tour pour la gestion de paquet d'entreprise sophistiquée.

Conda peut être installé dans un dossier Utilisateur (pas de permissions super-utilisateur) et fonctionne comme magic avec

conda installer

et puissant virtuel env expansion.


œufs de façon

cette option se rapportait: python-distribute.org et est largement dépassé (ainsi que le site), alors laissez-moi vous indiquer l'un des Prêt à l'emploi encore compact setup.py exemples que j'aime:

  • un exemple/implémentation très pratique de mixage de scripts et de fichiers python en setup.py donne ici
  • encore mieux que celui de hyperopt

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

  • setup.py parti!
  • distutils disparu!
  • distribuez gone!
  • pip et virtualenv ici pour rester!
  • œufs ... allé!

j'ajoute un point supplémentaire (de ma part)

  • roues !

je recommande d'obtenir une certaine compréhension de packaging-ecosystem (à partir du guide pointé par gotgenes) avant de tenter sans réfléchir copie-collage.

la plupart des exemples sur Internet commencent par

from distutils.core import setup

mais cet exemple ne supporte pas la construction d'un oeuf python setup.py bdist_egg (ainsi que d'autres anciennes caractéristiques), qui étaient disponibles en

from setuptools import setup

et la raison en est qu'ils sont dépréciés .

maintenant selon le guide

avertissement

s'il vous Plaît utiliser le Distribuer paquet plutôt que le paquet Setuptools parce qu'il y a des problèmes dans ce paquet qui peuvent et ne seront pas fixe.

les outils de Setup dépréciés doivent être remplacés par distutils2 , qui"fera partie de la bibliothèque standard en Python 3.3". Je dois dire que j'ai aimé les setuptools et les oeufs et n'ai pas encore été complètement convaincu par la commodité de distutils2. Il exige

pip install Distutils2

et d'installer

python -m distutils2.run install

PS

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

24
répondu Yauhen Yakimovich 2017-10-24 09:15:15

je recommande le setup.py de la Python Emballage Guide de l'Utilisateur à l 'exemple de projet.

Le Python de l'Emballage Guide de l'Utilisateur "vise à être la source de référence sur la façon d'emballer, de publier et d'installer Python distributions utilisant les outils actuels".

4
répondu Razzi Abuissa 2018-05-08 19:28:15

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

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

cela suppose que tout votre code est dans un seul fichier et indique comment empaqueter un projet contenant un seul module.

3
répondu Akshar Raaj 2014-12-23 11:43:26

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

le projet setup.py est inclus ci-dessous (voir le rapport 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='X.Y@Z.com',
      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 le fichier de spécifications RPM qui suit plus ou moins les directives 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 <X.Y@Z.com> - 0.0.1-1
- initial version
3
répondu marcindulak 2016-04-19 21:13:30