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?
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.
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.
LISEZ CE PREMIER https://packaging.python.org/en/latest/current.html
Recommandations relatives aux outils d'installation
- Utilisez pip pour installer Python de PyPI.
- Utilisez virtualenv ou pyvenv pour isoler les dépendances spécifiques à l’application d’une installation partagée Python.
- Utilisez la molette pip pour créer un cache des distributions de roues, afin d'accélérer les installations ultérieures.
- 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
- Utilisez setuptools pour définir des projets et créer des distributions source.
- 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.
- 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
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
L'histoire complète de correct python l'empaquetage (et à propos des roues) est couvert à packaging.python.org
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.
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: =
Cette citation est tirée du guide sur l'état de setup.py et s'applique toujours:
J'ajoute un autre point (de moi)
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
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.
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".
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.
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
exemple minimal
from setuptools import setup, find_packages
setup(name='foo',
version='1.0',
packages=find_packages(),
)