LISEZ CECI EN PREMIER https://packaging.python.org/en/latest/current.html
Recommandations d'outils d'installation
- Utilisez pip pour installer les packages Python à partir de PyPI.
- Utilisez virtualenv ou pyvenv pour isoler les dépendances spécifiques à une application d'une installation Python partagée.
- Utilisez pip wheel pour créer un cache des distributions de roues, dans le but> d'accélérer les installations ultérieures.
- 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
- Utilisez setuptools pour définir des projets et créer des distributions source.
- 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.
- 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
- Installation plus rapide pour les packages d'extension Python pur et C natif
- Évite l'exécution de code arbitraire pour l'installation. (Évite setup.py)
- L'installation d'une extension C ne nécessite pas de compilateur sous Windows ou OS X.
- Permet une meilleure mise en cache pour les tests et l'intégration continue.
- Crée des fichiers .pyc dans le cadre de l'installation pour s'assurer qu'ils correspondent à l'interpréteur python utilisé.
- 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)
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.
Exemple minimal
from setuptools import setup, find_packages setup( name="foo", version="1.0", packages=find_packages(), )
Plus d'informations dans la documentation
la source
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
la source
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".
la source
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 se trouve dans un seul fichier et indique comment empaqueter un projet contenant un seul module.
la source
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
Usage
Pour générer le fichier setup.py , tapez simplement le terminal.
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é :
Voici le lien vers le référentiel. Remplissez gratuitement pour améliorer la solution.
la source