setup.py esempi?


Risposte:


62

Guida completa per la scrittura di setup.pyscript qui . (con alcuni esempi)

Se desideri un esempio del mondo reale, potrei indicarti le setup.pysceneggiature di un paio di progetti importanti. Django's è qui , pyglet's è qui . Puoi semplicemente sfogliare l'origine di altri progetti per un file chiamato setup.py per ulteriori esempi.

Questi non sono semplici esempi; il link al tutorial che ho fornito ha quelli. Questi sono più complessi, ma anche più pratici.


30

Potresti trovare utile la Guida al packaging di HitchHiker , anche se incompleta. Inizierei con il tutorial Quick Start . Prova anche a sfogliare i pacchetti Python nell'indice dei pacchetti Python . Basta scaricare il tarball, decomprimerlo e dare un'occhiata al setup.pyfile. O ancora meglio, preoccupati solo di guardare i pacchetti che elencano un repository di codice sorgente pubblico come uno ospitato su GitHub o BitBucket. Sei destinato a incontrarne uno in prima pagina.

Il mio ultimo suggerimento è di provarci e provare a crearne uno; non aver paura di fallire. Non l'ho capito davvero fino a quando non ho iniziato a realizzarli da solo. È banale creare un nuovo pacchetto su PyPI e altrettanto facile rimuoverlo. Quindi, crea un pacchetto fittizio e gioca.


26

LEGGERE PRIMA QUESTO https://packaging.python.org/en/latest/current.html

Suggerimenti sullo strumento di installazione

  1. Usa pip per installare i pacchetti Python da PyPI.
  2. Usa virtualenv o pyvenv per isolare le dipendenze specifiche dell'applicazione da un'installazione Python condivisa.
  3. Usa pip wheel per creare una cache delle distribuzioni delle ruote, allo scopo di> velocizzare le installazioni successive.
  4. Se stai cercando la gestione di stack software multipiattaforma completamente integrati, prendi in considerazione buildout (incentrato principalmente sulla comunità di sviluppo web) o Hashdist o conda (entrambi focalizzati principalmente sulla comunità scientifica).

Raccomandazioni sugli strumenti di imballaggio

  1. Usa setuptools per definire progetti e creare distribuzioni sorgente.
  2. Usa l'estensione bdist_wheel setuptools disponibile dal progetto wheel per creare ruote. Ciò è particolarmente vantaggioso se il progetto contiene estensioni binarie.
  3. Usa lo spago per caricare le distribuzioni su PyPI.

Questa risposta è invecchiata e in effetti esiste un piano di salvataggio per il mondo degli imballaggi Python chiamato

modo ruote

Ho qoute pythonwheels.com qui:

Cosa sono le ruote?

Le ruote sono il nuovo standard della distribuzione di Python e hanno lo scopo di sostituire le uova. Il supporto è offerto in pip> = 1.4 e setuptools> = 0.8.

Vantaggi delle ruote

  1. Installazione più rapida per python puro e pacchetti di estensione C nativi.
  2. Evita l'esecuzione di codice arbitrario per l'installazione. (Evita setup.py)
  3. L'installazione di un'estensione C non richiede un compilatore su Windows o OS X.
  4. Consente una migliore memorizzazione nella cache per i test e l'integrazione continua.
  5. Crea file .pyc come parte dell'installazione per garantire che corrispondano all'interprete Python utilizzato.
  6. Installazioni più coerenti su piattaforme e macchine.

La storia completa del corretto packaging in Python (e delle ruote) è trattata su packaging.python.org


modo conda

Per il calcolo scientifico (consigliato anche su packaging.python.org, vedi sopra), prenderei in considerazione l'utilizzo di pacchetti CONDA che possono essere visti come un servizio di terze parti costruito su PyPI e pip tools. Funziona benissimo anche sulla configurazione della tua versione di binstar, quindi immagino che possa fare il trucco per la sofisticata gestione dei pacchetti aziendali personalizzati.

Conda può essere installato in una cartella utente (senza permessi da super utente) e funziona come per magia con

conda install

e potente espansione dell'ambiente virtuale.


modo delle uova

Questa opzione era correlata a python-distribute.org ed è ampiamente obsoleta (così come il sito), quindi lascia che ti indichi uno degli esempi setup.py pronti per l'uso ma compatti che mi piacciono:

  • Un esempio / implementazione molto pratico di miscelazione di script e singoli file Python in setup.py viene fornito qui
  • Ancora meglio uno da hyperopt

Questa citazione è stata presa dalla guida sullo stato di setup.py e vale ancora:

  • setup.py andato!
  • distutils andato!
  • distribuire andato!
  • pip e virtualenv qui per restare!
  • uova ... sparite!

Aggiungo un altro punto (da me)

  • ruote !

Consiglierei di avere una certa comprensione dell'ecosistema del packaging (dalla guida indicata da gotgenes) prima di tentare il copia-incolla insensato.

La maggior parte degli esempi in Internet iniziano con

from distutils.core import setup

ma questo ad esempio non supporta la creazione di un setup egg python.py bdist_egg (così come alcune altre vecchie funzionalità), che erano disponibili

from setuptools import setup

E il motivo è che sono deprecati .

Ora secondo la guida

avvertimento

Si prega di utilizzare il pacchetto Distribute piuttosto che il pacchetto Setuptools perché ci sono problemi in questo pacchetto che possono e non verranno risolti.

setuptools deprecati devono essere sostituiti da distutils2 , che "farà parte della libreria standard in Python 3.3". Devo dire che mi piacevano setuptools e eggs e non sono ancora stato completamente convinto dalla comodità di distutils2. Richiede

pip install Distutils2

e da installare

python -m distutils2.run install

PS

Il packaging non è mai stato banale (si impara provando a svilupparne uno nuovo), quindi presumo che molte cose siano andate per ragione. Spero solo che questa volta sarà è fatto correttamente.


4
allora, come è invecchiata questa risposta? distutils2 è stato fornito con Python 3.3? setuptools è morto e appassito?
Capi Etheriel

Puoi dare il riferimento alla "guida sullo stato di setup.py"? Perché questo "setup.py andato!" è sbagliato. È il 2017 e setup.py è ancora qui.
karantan

12

Esempio minimo

from setuptools import setup, find_packages


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

Maggiori informazioni nei documenti


5

Guarda questo esempio completo https://github.com/marcindulak/python-mycli di un piccolo pacchetto Python. Si basa sui consigli di pacchettizzazione da https://packaging.python.org/en/latest/distributing.html , usa setup.py con distutils e inoltre mostra come creare pacchetti RPM e deb.

Il file setup.py del progetto è incluso di seguito (vedere il repository per i sorgenti completi):

#!/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='X.Y@Z.com',
      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 il file delle specifiche RPM che più o meno segue le linee guida per la pacchettizzazione Fedora / EPEL può avere il seguente aspetto:

# 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 <X.Y@Z.com> - 0.0.1-1
- initial version

2
per favore, invece di copiare / incollare semplicemente i link, prova a estrarre la parte significativa che risponde effettivamente alla domanda
fredmaggiowski

5

Raccomando il setup.py del progetto di esempio della Python Packaging User Guide .

La Python Packaging User Guide "mira ad essere la risorsa autorevole su come impacchettare, pubblicare e installare distribuzioni Python utilizzando gli strumenti attuali".



3

Ecco l'utility che ho scritto per generare un semplice file setup.py (template) con commenti e link utili. Spero sia utile.

Installazione

sudo pip install setup-py-cli

Utilizzo

Per generare il file setup.py basta digitare nel terminale.

setup-py

Ora il file setup.py dovrebbe trovarsi nella directory corrente.

Setup.py generato

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

Contenuto del setup.py generato :

  • nome del pacchetto soddisfatto automaticamente in base al nome della directory corrente.
  • alcuni campi di base da soddisfare.
  • chiarire commenti e collegamenti a risorse utili.
  • descrizione inserita automaticamente da README.md o una stringa vuota se non è presente README.md .

Ecco il collegamento al repository. Compila gratuitamente per migliorare la soluzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.