setup.py przykłady?


Odpowiedzi:


60

Kompletny opis pisania setup.pyskryptów tutaj . (z kilkoma przykładami)

Jeśli chcesz uzyskać przykład ze świata rzeczywistego, mógłbym wskazać Ci setup.pyscenariusze kilku dużych projektów. Django jest tutaj , pyglet's jest tutaj . Możesz po prostu przejrzeć źródła innych projektów w poszukiwaniu pliku o nazwie setup.py, aby uzyskać więcej przykładów.

To nie są proste przykłady; link do samouczka, który podałem, ma takie. Są bardziej złożone, ale też bardziej praktyczne.


30

Można wybrać Autostopem Packaging pomocny, mimo że jest niekompletny. Zacząłbym od samouczka Szybki start . Spróbuj też po prostu przejrzeć pakiety Pythona w indeksie pakietów Pythona . Po prostu pobierz archiwum, rozpakuj je i zajrzyj do plikusetup.py plik. Lub nawet lepiej, przejmuj się tylko przeglądaniem pakietów, które zawierają publiczne repozytorium kodu źródłowego, takie jak hostowane na GitHub lub BitBucket. Z pewnością natkniesz się na jednego na pierwszej stronie.

Moja ostatnia sugestia jest taka, żeby po prostu to zrobić i spróbować zrobić; nie bój się porażki. Naprawdę tego nie rozumiałem, dopóki sam nie zacząłem ich tworzyć. Utworzenie nowego pakietu na PyPI jest trywialne i równie łatwe do usunięcia. Stwórz więc fałszywą paczkę i pobaw się.


26

PRZECZYTAJ NAJPIERW https://packaging.python.org/en/latest/current.html

Zalecenia dotyczące narzędzi instalacyjnych

  1. Użyj pip, aby zainstalować pakiety Pythona z PyPI.
  2. Użyj virtualenv lub pyvenv, aby odizolować zależności aplikacji od współdzielonej instalacji języka Python.
  3. Użyj koła pip, aby utworzyć pamięć podręczną rozkładów kół w celu> przyspieszenia kolejnych instalacji.
  4. Jeśli szukasz zarządzania w pełni zintegrowanymi wieloplatformowymi stosami oprogramowania, rozważ buildout (głównie skupiony na społeczności programistów internetowych) lub Hashdist lub conda (oba koncentrują się głównie na społeczności naukowej).

Zalecenia dotyczące narzędzi do pakowania

  1. Użyj setuptools do definiowania projektów i tworzenia dystrybucji źródłowych.
  2. Użyj rozszerzenia setuptools bdist_wheel dostępnego w projekcie koła, aby utworzyć koła. Jest to szczególnie korzystne, jeśli Twój projekt zawiera rozszerzenia binarne.
  3. Użyj sznurka do przesyłania dystrybucji do PyPI.

Ta odpowiedź się zestarzała i rzeczywiście istnieje plan ratunkowy dla świata pakowania Pythona o nazwie

koła sposób

I qoute pythonwheels.com tutaj:

Co to są koła?

Kółka są nowym standardem dystrybucji Pythona i mają zastąpić jajka. Wsparcie jest oferowane w pip> = 1.4 i setuptools> = 0.8.

Zalety kół

  1. Szybsza instalacja dla czystych pakietów rozszerzeń języka Python i natywnych C.
  2. Pozwala uniknąć wykonania dowolnego kodu podczas instalacji. (Unika setup.py)
  3. Instalacja rozszerzenia C nie wymaga kompilatora w systemie Windows lub OS X.
  4. Umożliwia lepsze buforowanie na potrzeby testowania i ciągłej integracji.
  5. Tworzy pliki .pyc jako część instalacji, aby upewnić się, że są one zgodne z używanym interpreterem języka Python.
  6. Bardziej spójne instalacje na różnych platformach i maszynach.

Pełną historię poprawnego pakowania Pythona (i kół) można znaleźć na stronie Packaging.python.org


Conda Way

W przypadku obliczeń naukowych (jest to również zalecane na stronie Packaging.python.org , patrz wyżej) rozważyłbym użycie pakietu CONDA, które można postrzegać jako usługę innej firmy opartą na narzędziach PyPI i pip. Świetnie sprawdza się również przy tworzeniu własnej wersji binstar więc wyobrażam sobie, że może to zrobić dla wyrafinowanego zarządzania niestandardowymi pakietami dla przedsiębiorstw.

Conda można zainstalować w folderze użytkownika (bez uprawnień superużytkownika) i działa jak magia z

conda install

i potężne wirtualne rozszerzenie środowiska.


sposób na jajka

Ta opcja była związana z python-distribute.org i jest znacznie przestarzała (podobnie jak strona), więc pozwól mi wskazać jeden z gotowych do użycia, ale kompaktowych przykładów setup.py, które lubię:

  • Podaje się bardzo praktyczny przykład / implementacja mieszania skryptów i pojedynczych plików Pythona w setup.py tutaj
  • Jeszcze lepszy od hyperopt

Ten cytat pochodzi z przewodnika po stanie setup.py i nadal obowiązuje:

  • setup.py zniknął!
  • distutils odszedł!
  • dystrybucja nie ma!
  • pip i virtualenv zostaną tutaj!
  • jajka ... zniknęły!

Dodaję jeszcze jeden punkt (ode mnie)

  • koła !

Polecam, aby uzyskać pewne zrozumienie pakowania ekosystemu (od przewodnika wskazanych przez gotgenes) przed przystąpieniem do bezmyślnego kopiowania i wklejania.

Większość przykładów w Internecie zaczyna się od

from distutils.core import setup

ale to na przykład nie obsługuje budowania pythona w jajku setup.py bdist_egg (jak również innych starych funkcji), które były dostępne w

from setuptools import setup

Powodem jest to, że są przestarzałe .

Teraz według przewodnika

Ostrzeżenie

Skorzystaj z pakietu Distribute zamiast pakietu Setuptools, ponieważ w tym pakiecie występują problemy, które można i nie można naprawić.

przestarzałe setuptools mają zostać zastąpione przez distutils2 , który „będzie częścią standardowej biblioteki w Pythonie 3.3”. Muszę powiedzieć, że lubiłem setuptools i jajka i jeszcze nie przekonałem się do końca wygodą distutils2. To wymaga

pip install Distutils2

i zainstalować

python -m distutils2.run install

PS

Pakowanie nigdy nie było trywialne (uczy się tego, próbując opracować nowe), więc zakładam, że wiele rzeczy poszło bez powodu. Mam tylko nadzieję, że tym razem będzie to zrobione poprawnie.


4
więc jak postarzała się ta odpowiedź? czy distutils2 zawierało Pythona 3.3? czy setuptools umarły i uschły?
Capi Etheriel

Czy możesz podać odniesienie do „przewodnika po stanie setup.py”? Ponieważ ten "setup.py poszedł!" jest źle. Jest rok 2017, a setup.py si wciąż tu jest.
karantan

11

Minimalny przykład

from setuptools import setup, find_packages


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

Więcej informacji w dokumentach


5

Spójrz na ten kompletny przykład https://github.com/marcindulak/python-mycli małego pakietu Pythona. Opiera się na zaleceniach dotyczących pakowania z https://packaging.python.org/en/latest/distributing.html , używa setup.py z distutils, a ponadto pokazuje, jak tworzyć pakiety RPM i deb.

Poniżej znajduje się plik setup.py projektu (pełne źródło można znaleźć w repozytorium):

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

a plik specyfikacji RPM, który mniej więcej jest zgodny z wytycznymi dotyczącymi pakowania Fedory / EPEL, może wyglądać następująco:

# 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
proszę, zamiast po prostu kopiować / wklejać linki, spróbuj wyodrębnić znaczącą część, która faktycznie odpowiada na pytanie
fredmaggiowski



2

Oto narzędzie, które napisałem, aby wygenerować prosty plik setup.py plik (szablon) z przydatnymi komentarzami i linkami. Mam nadzieję, że się przyda.

Instalacja

sudo pip install setup-py-cli

Stosowanie

Aby wygenerować plik setup.py po prostu wpisz terminal.

setup-py

Teraz plik setup.py powinien pojawić się w bieżącym katalogu.

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

Treść wygenerowanego setup.py :

  • automatycznie wypełniana nazwa pakietu na podstawie nazwy bieżącego katalogu.
  • kilka podstawowych pól do spełnienia.
  • wyjaśniające komentarze i linki do przydatnych zasobów.
  • automatycznie wstawiony opis z README.md lub pusty ciąg, jeśli nie ma pliku README.md .

Oto link do repozytorium. Wypełnij bezpłatnie, aby ulepszyć rozwiązanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.