exemplos de setup.py?

88

Depois de estudar esta página:

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

Espero encontrar alguns arquivos setup.py para estudar e fazer meus próprios (com o objetivo de fazer um arquivo fedora rpm).

A comunidade so poderia me indicar alguns bons exemplos?

Jedierikb
fonte

Respostas:

60

Passo a passo completo sobre como escrever setup.pyscripts aqui . (com alguns exemplos)

Se você quiser um exemplo do mundo real, posso apontar os setup.pyroteiros de alguns projetos importantes. Django's está aqui , pyglet's está aqui . Você pode simplesmente navegar na origem de outros projetos para um arquivo denominado setup.py para obter mais exemplos.

Estes não são exemplos simples; o link do tutorial que dei tem aqueles. São mais complexos, mas também mais práticos.

Rafe Kettler
fonte
30

Você pode achar o Guia de Empacotamento do HitchHiker útil, embora esteja incompleto. Eu começaria com o tutorial de início rápido . Experimente também apenas navegar pelos pacotes Python no índice de pacotes Python . Apenas baixe o tarball, descompacte-o e dê uma olhada no setup.pyarquivo. Ou melhor ainda, apenas se preocupe em olhar os pacotes que listam um repositório de código-fonte público, como um hospedado no GitHub ou BitBucket. Você está fadado a encontrar um na primeira página.

Minha sugestão final é ir em frente e tentar fazer um; não tenha medo de falhar. Eu realmente não entendia até começar a fazer eu mesma. É trivial criar um novo pacote no PyPI e tão fácil quanto removê-lo. Então, crie um pacote fictício e brinque.

Gotgenes
fonte
26

LEIA ESTE PRIMEIRO https://packaging.python.org/en/latest/current.html

Recomendações de ferramentas de instalação

  1. Use pip para instalar pacotes Python do PyPI.
  2. Use virtualenv ou pyvenv para isolar dependências específicas do aplicativo de uma instalação compartilhada do Python.
  3. Use pip wheel para criar um cache de distribuições de wheel, com o objetivo de> acelerar as instalações subsequentes.
  4. Se você estiver procurando por gerenciamento de pilhas de software de plataforma cruzada totalmente integradas, considere buildout (focado principalmente na comunidade de desenvolvimento da web) ou Hashdist, ou conda (ambos focados principalmente na comunidade científica).

Recomendações de ferramentas de embalagem

  1. Use setuptools para definir projetos e criar distribuições de origem.
  2. Use a extensão bdist_wheel setuptools disponível no projeto de roda para criar rodas. Isso é especialmente benéfico se o seu projeto contiver extensões binárias.
  3. Use barbante para enviar distribuições para PyPI.

Este anwser envelheceu e, de fato, existe um plano de resgate para o mundo do empacotamento python chamado

caminho das rodas

I qoute pythonwheels.com aqui:

O que são rodas?

Rodas são o novo padrão de distribuição python e têm como objetivo substituir os ovos. O suporte é oferecido em pip> = 1.4 e setuptools> = 0.8.

Vantagens das rodas

  1. Instalação mais rápida para python puro e pacotes de extensão C nativos.
  2. Evita a execução arbitrária de código para instalação. (Evita setup.py)
  3. A instalação de uma extensão C não requer um compilador no Windows ou OS X.
  4. Permite um melhor armazenamento em cache para teste e integração contínua.
  5. Cria arquivos .pyc como parte da instalação para garantir que eles correspondam ao interpretador Python usado.
  6. Instalações mais consistentes em plataformas e máquinas.

A história completa do empacotamento correto do python (e sobre rodas) é abordada em packaging.python.org


Conda Way

Para computação científica (isso também é recomendado em packaging.python.org, veja acima), eu consideraria usar o pacote CONDA, que pode ser visto como um serviço de terceiros criado com base nas ferramentas PyPI e pip. Ele também funciona muito bem na configuração de sua própria versão do binstar, então eu imagino que ele pode fazer o truque para um gerenciamento sofisticado de pacotes corporativos personalizados.

O Conda pode ser instalado em uma pasta de usuário (sem permissão de superusuário) e funciona como mágica com

conda instalar

e uma poderosa expansão de env virtual.


caminho dos ovos

Essa opção estava relacionada a python-distribute.org e está amplamente desatualizada (assim como o site), portanto, deixe-me indicar um dos exemplos de setup.py prontos para uso, mas compactos, de que gosto:

  • Um exemplo / implementação muito prático de misturar scripts e arquivos Python únicos em setup.py é dado aqui
  • Melhor ainda do hyperopt

Esta citação foi retirada do guia sobre o estado de setup.py e ainda se aplica:

  • setup.py foi!
  • distutils ido!
  • distribuir ido!
  • pip e virtualenv vieram para ficar!
  • ovos ... sumiram!

Eu adiciono mais um ponto (de mim)

  • rodas !

Eu recomendaria obter alguma compreensão do ecossistema de empacotamento (a partir do guia apontado por gotgenes) antes de tentar copiar e colar sem pensar.

A maioria dos exemplos na Internet começa com

from distutils.core import setup

mas isso, por exemplo, não suporta a construção de um egg python setup.py bdist_egg (bem como alguns outros recursos antigos ), que estavam disponíveis em

from setuptools import setup

E a razão é que eles estão obsoletos .

Agora de acordo com o guia

Atenção

Use o pacote Distribute em vez do pacote Setuptools porque há problemas neste pacote que podem e não serão corrigidos.

Ferramentas de instalação obsoletas devem ser substituídas por distutils2 , que "fará parte da biblioteca padrão no Python 3.3". Devo dizer que gostei de ferramentas de instalação e de ovos e ainda não fui completamente convencido pela conveniência de distutils2. Isso requer

pip install Distutils2

e instalar

python -m distutils2.run install

PS

O empacotamento nunca foi trivial (aprende-se isso tentando desenvolver um novo), então presumo que muitas coisas aconteceram por motivo. Eu só espero que desta vez vai ser é feito corretamente.

Yauhen Yakimovich
fonte
4
então, como essa resposta envelheceu? distutils2 veio com o python 3.3? as ferramentas de instalação morreram e murcharam?
Capi Etheriel
Você pode dar uma referência ao "guia sobre o estado de setup.py"? Porque esse "setup.py foi!" está errado. É 2017 e setup.py si ainda está aqui.
karantan
11

Exemplo mínimo

from setuptools import setup, find_packages


setup(
    name="foo",
    version="1.0",
    packages=find_packages(),
)

Mais informações nos documentos

jozo
fonte
5

Veja este exemplo completo https://github.com/marcindulak/python-mycli de um pequeno pacote python. É baseado nas recomendações de empacotamento de https://packaging.python.org/en/latest/distributing.html , usa setup.py com distutils e além disso mostra como criar pacotes RPM e deb.

O setup.py do projeto está incluído abaixo (consulte o repositório para obter o código-fonte 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,
      )

e um arquivo de especificação RPM que segue mais ou menos as diretrizes de empacotamento Fedora / EPEL pode ser semelhante a:

# 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
Marcindulak
fonte
2
por favor, em vez de simplesmente copiar / colar links, tente extrair a parte significativa que realmente responde à pergunta
fredmaggiowski
5

Eu recomendo o setup.py do projeto de exemplo do Python Packaging User Guide .

O Python Packaging User Guide "pretende ser o recurso oficial sobre como empacotar, publicar e instalar distribuições Python usando as ferramentas atuais".

Razzi Abuissa
fonte
2

Aqui está o utilitário que escrevi para gerar um arquivo setup.py simples (modelo) com comentários e links úteis. Espero que seja útil.

Instalação

sudo pip install setup-py-cli

Uso

Para gerar o arquivo setup.py basta digitar no terminal.

setup-py

Agora, o arquivo setup.py deve ocorrer no diretório atual.

Setup.py gerado

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=[]  
)

Conteúdo do setup.py gerado :

  • nome do pacote preenchido automaticamente com base no nome do diretório atual.
  • alguns campos básicos a cumprir.
  • esclarecer comentários e links para recursos úteis.
  • inserida automaticamente a descrição de README.md ou uma string vazia se não houver README.md .

Aqui está o link para o repositório. Preencha gratuitamente para aprimorar a solução.

voilalex
fonte