LEIA ESTE PRIMEIRO https://packaging.python.org/en/latest/current.html
Recomendações de ferramentas de instalação
- Use pip para instalar pacotes Python do PyPI.
- Use virtualenv ou pyvenv para isolar dependências específicas do aplicativo de uma instalação compartilhada do Python.
- Use pip wheel para criar um cache de distribuições de wheel, com o objetivo de> acelerar as instalações subsequentes.
- 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
- Use setuptools para definir projetos e criar distribuições de origem.
- 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.
- 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
- Instalação mais rápida para python puro e pacotes de extensão C nativos.
- Evita a execução arbitrária de código para instalação. (Evita setup.py)
- A instalação de uma extensão C não requer um compilador no Windows ou OS X.
- Permite um melhor armazenamento em cache para teste e integração contínua.
- Cria arquivos .pyc como parte da instalação para garantir que eles correspondam ao interpretador Python usado.
- 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)
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.
Exemplo mínimo
from setuptools import setup, find_packages setup( name="foo", version="1.0", packages=find_packages(), )
Mais informações nos documentos
fonte
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
fonte
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".
fonte
Aqui você encontrará o exemplo mais simples possível de uso de distutils e setup.py:
https://docs.python.org/2/distutils/introduction.html#distutils-simple-example
Isso pressupõe que todo o seu código está em um único arquivo e informa como empacotar um projeto contendo um único módulo.
fonte
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
Uso
Para gerar o arquivo setup.py basta digitar no terminal.
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 :
Aqui está o link para o repositório. Preencha gratuitamente para aprimorar a solução.
fonte