2011-01-19 19 views

Respuesta

44

Recorrido completo de escritura setup.py guiones here. (con algunos ejemplos)

Si desea un ejemplo del mundo real, podría indicarle los scripts setup.py de un par de grandes proyectos. Django's es here, Pyglet's es here. Puede buscar el origen de otros proyectos para un archivo llamado setup.py para obtener más ejemplos.

Estos no son ejemplos simples; el enlace del tutorial que di tiene esos. Estos son más complejos, pero también más prácticos.

27

Puede resultarle útil HitchHiker's Guide to Packaging, aunque esté incompleto. Comenzaría con el Quick Start tutorial. Intenta también navegar por los paquetes de Python en el Python Package Index. Simplemente descargue el archivo tar, descomprímalo y eche un vistazo al archivo setup.py. O mejor aún, solo moleste en buscar paquetes que enumeren un repositorio de código fuente público como el que se encuentra en GitHub o BitBucket. Es probable que se encuentre con uno en la página principal.

Mi sugerencia final es simplemente intentarlo e intentar hacer una; no tengas miedo de fallar Realmente no lo entendí hasta que comencé a hacerlos yo mismo. Es trivial crear un nuevo paquete en PyPI e igual de fácil de eliminar. Por lo tanto, crea un paquete ficticio y juega.

22

Lea esto primerohttps://packaging.python.org/en/latest/current.html

instalación Recomendaciones de herramientas

  1. Uso pip para instalar los paquetes de Python de PyPI.
  2. Utilice virtualenv o pyvenv para aislar las dependencias específicas de la aplicación de una instalación compartida de Python.
  3. Utilice la rueda de pip para crear un caché de distribuciones de rueda, con el fin de acelerar las instalaciones posteriores.
  4. Si está buscando la administración de paquetes de software multiplataforma totalmente integrados, considere la creación (principalmente enfocada en la comunidad de desarrollo web) o Hashdist, o conda (ambos enfocados principalmente en la comunidad científica).

Recomendaciones herramienta de empaquetado

  1. Use setuptools para definir proyectos y crean Fuente Distribuciones.
  2. Utilice la extensión bdist_wheel setuptools disponible en el proyecto de ruedas para crear ruedas. Esto es especialmente beneficioso, si su proyecto contiene extensiones binarias.
  3. Usa twine para subir distribuciones a PyPI.

Este anwser ha envejecido, y de hecho no es un plan de rescate para el mundo del packaging Python llamada

ruedas de manera

I Qoute pythonwheels.com aquí:

¿Qué son ruedas?

Las ruedas son el nuevo estándar de distribución de pitón y están destinadas a reemplazar huevos. El soporte se ofrece en pip> = 1.4 y setuptools> = 0.8.

Ventajas de ruedas

  1. más rápido de instalación de Python puro y paquetes de extensión C nativas.
  2. Evita la ejecución de código arbitrario para la instalación. (Evita setup.py)
  3. La instalación de una extensión C no requiere un compilador en Windows o OS X.
  4. permite un mejor almacenamiento en caché para la prueba y continua integración.
  5. Crea archivos .pyc como parte de la instalación para asegurar que coincidan con el intérprete de python utilizado.
  6. Instalaciones más consistentes en plataformas y máquinas.

La historia completa de los envases pitón correcta (y sobre ruedas) se cubre en packaging.python.org


Conda manera

de Computación Científica (esto también se recomienda en packaging.python.org, ver arriba) Consideraría usar CONDA packaging que puede verse como una compilación de servicios de terceros sobre las herramientas PyPI y pip. También funciona muy bien en la configuración de su propia versión de binstar, así que me imagino que puede hacer el truco para la sofisticada administración personalizada de paquetes empresariales.

Conda se puede instalar en una carpeta de usuario (no hay permisssions de superusuario) y funciona como magia con

Conda instalar

y potente expansión env virtual.


huevos de manera

Esta opción se relacionó con python-distribute.org y es largerly obsoleta (así como el sitio) así que voy a señalar a uno de la lista para utilizar la configuración y compacto .py ejemplos que me gustan:

  • Un ejemplo muy práctico/ejecución de secuencias de comandos de mezcla y los archivos individuales en pitón setup.py está dando here
  • Aún mejor uno de hyperopt

Esta cita fue tomada de la guía sobre el estado de setup.py y todavía se aplica :

  • setup.py ido!
  • distutils gone!
  • Distribuir ido!
  • pip y virtualenv aquí para quedarse!
  • huevos ... ¡se han ido!

agrego un punto más (de mí)

  • ruedas!

recomendaría para conseguir una cierta comprensión de packaging-ecosystem (de la guía señalado por gotgenes) antes de intentar copiar y pegar sin sentido.

La mayoría de los ejemplos que hay en el internet a empezar con

from distutils.core import setup 

pero esto, por ejemplo, no es compatible con la construcción de un huevo pitón setup.py bdist_egg (así como algunos otros viejos características), los cuales estaban disponibles en

from setuptools import setup 

Y la razón es que son obsoleta.

Ahora bien, según la guía

Advertencia

Utilice el paquete en lugar de distribuir el paquete Setuptools porque hay problemas en este paquete que se puede y no serán fijo.

setuptools obsoletas van a ser sustituidos por distutils2, que "va a ser parte de la biblioteca estándar en Python 3.3". Debo decir que me gustaron las herramientas de configuración y los huevos, y aún no me convencieron del todo por la conveniencia de distutils2.Requiere

pip install Distutils2 

e instalar

python -m distutils2.run install 

PS

del embalaje no fue trivial (uno se entera de esto tratando de desarrollar una nueva), por lo que asume una muchas cosas han ido por la razón. Solo espero que esta vez sea hecho correctamente.

+4

Entonces, ¿cómo ha envejecido esta respuesta? did distutils2 viene con Python 3.3? ¿Las herramientas de configuración murieron y se marchitaron? –

+1

actualizado con ruedas y opciones de conda –

+0

Parece que el equipo de PyPA hizo un gran trabajo después de todo https://www.pypa.io –

2

Recomiendo el setup.py del proyecto de ejemplo Python Packaging User Guide.

La Guía del usuario de Python Packaging "pretende ser el recurso autorizado sobre cómo empaquetar, publicar e instalar distribuciones de Python con las herramientas actuales".

2

Mire este ejemplo completo https://github.com/marcindulak/python-mycli de un pequeño paquete de python. Se basa en las recomendaciones de embalaje del https://packaging.python.org/en/latest/distributing.html, utiliza setup.py con distutils y, además, muestra cómo crear paquetes RPM y deb.

setup.py del proyecto se incluye a continuación (véase el repositorio para la fuente completo):

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

y especificaciones RPM y de archivos que más o menos sigue las directrices de embalaje Fedora/EPEL puede verse como:

# 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 
+2

por favor, en lugar de simplemente copiar/pegar enlaces intente extraer la parte importante que realmente responde a la pregunta – FredMaggiowski