setup.py примеры?

88

После изучения этой страницы:

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

Я надеюсь найти несколько файлов setup.py для изучения и создания своих собственных (с целью создания rpm-файла Fedora).

Может ли сообщество так указать мне на несколько хороших примеров?

jedierikb
источник

Ответы:

60

Полное пошаговое руководство по написанию setup.pyскриптов здесь . (с некоторыми примерами)

Если вам нужен реальный пример, я могу указать вам на setup.pyсценарии пары крупных проектов. Джанго здесь , пиглет здесь . Вы можете просто просмотреть источник других проектов и найти файл с именем setup.py для получения дополнительных примеров.

Это не простые примеры; ссылка на учебник, которую я дал, имеет их. Они более сложные, но и более практичные.

Рэйф Кеттлер
источник
30

Вы можете найти Руководство автостопщика по упаковке полезным, хотя оно и неполное. Я бы начал с руководства по быстрому запуску . Попробуйте также просто просмотреть пакеты Python в указателе пакетов Python . Просто скачайте архив, распакуйте его и просмотрите setup.pyфайл. Или, что еще лучше, просто просматривайте пакеты, в которых перечислены общедоступные репозитории исходного кода, например, размещенный на GitHub или BitBucket. Вы обязательно столкнетесь с одним из них на первой странице.

Мое последнее предложение - просто пойти на это и попробовать сделать один; не бойтесь потерпеть неудачу. Я действительно не понимал этого, пока не начал делать их сам. Создать новый пакет на PyPI - тривиально, и так же легко его удалить. Итак, создайте фиктивный пакет и поэкспериментируйте.

gotgenes
источник
26

ПРОЧИТАЙТЕ ЭТО Вначале https://packaging.python.org/en/latest/current.html

Рекомендации по установке

  1. Используйте pip для установки пакетов Python из PyPI.
  2. Используйте virtualenv или pyvenv, чтобы изолировать зависимости приложения от общей установки Python.
  3. Используйте pip wheel для создания кеша распределений wheel, чтобы> ускорить последующие установки.
  4. Если вы ищете управление полностью интегрированными кросс-платформенными стеками программного обеспечения, подумайте о buildout (в первую очередь ориентированном на сообщество веб-разработчиков), Hashdist или conda (оба в первую очередь ориентированы на научное сообщество).

Рекомендации по упаковочным инструментам

  1. Используйте setuptools для определения проектов и создания исходных дистрибутивов.
  2. Используйте расширение bdist_wheel setuptools, доступное в проекте wheel, для создания колес. Это особенно полезно, если ваш проект содержит двоичные расширения.
  3. Используйте шпагат для загрузки дистрибутивов в PyPI.

Этот anwser устарел, и действительно существует план спасения мира упаковки Python под названием

колеса путь

Я цитирую pythonwheels.com здесь:

Какие колеса?

Колеса - это новый стандарт распространения Python, предназначенный для замены яиц. Поддержка предлагается в pip> = 1.4 и setuptools> = 0.8.

Преимущества колес

  1. Более быстрая установка пакетов расширений на чистом Python и нативном языке C.
  2. Избегает выполнения произвольного кода для установки. (Избегает setup.py)
  3. Для установки расширения C не требуется компилятор в Windows или OS X.
  4. Обеспечивает лучшее кэширование для тестирования и непрерывной интеграции.
  5. Создает файлы .pyc как часть установки, чтобы убедиться, что они соответствуют используемому интерпретатору python.
  6. Более согласованная установка на разных платформах и машинах.

Полную историю правильной упаковки Python (и о колесах) можно найти на package.python.org.


Конда путь

Для научных вычислений (это также рекомендуется на package.python.org, см. Выше) я бы подумал об использовании упаковки CONDA, которая может рассматриваться как сборка сторонних сервисов поверх PyPI и инструментов pip. Он также отлично работает при настройке вашей собственной версии binstar, поэтому я могу представить, что он может помочь в сложном управлении пользовательскими корпоративными пакетами.

Conda может быть установлена ​​в папку пользователя (без прав суперпользователя) и работает как по волшебству с

установка conda

и мощное расширение виртуального окружения.


путь яиц

Этот вариант был связан с python-distribute.org и значительно устарел (как и сам сайт), поэтому позвольте мне указать вам на один из готовых к использованию, но компактных примеров setup.py, которые мне нравятся:

  • Очень практический пример / реализация смесительных скриптов и отдельных файлов питона в setup.py дает здесь
  • Еще лучше от гиперопта

Эта цитата была взята из руководства по состоянию setup.py и действует до сих пор:

  • setup.py ушел!
  • distutils ушел!
  • раздача пошла!
  • pip и virtualenv здесь, чтобы остаться!
  • яйца ... пропали!

Я добавляю еще один балл (от себя)

  • колеса !

Я бы порекомендовал получить некоторое представление об экосистеме упаковки (из руководства, на которое указал gotgenes), прежде чем пытаться бездумно копировать.

Большинство примеров в Интернете начинаются с

from distutils.core import setup

но это, например, не поддерживает сборку яйца python setup.py bdist_egg (а также некоторые другие старые функции), которые были доступны в

from setuptools import setup

Причина в том, что они устарели .

Теперь по гиду

Предупреждение

Используйте пакет Distribute, а не пакет Setuptools, потому что в этом пакете есть проблемы, которые можно и не будут устранять.

устаревшие инструменты установки должны быть заменены на distutils2 , который «станет частью стандартной библиотеки в Python 3.3». Я должен сказать, что мне понравились инструменты настройки и яйца, и я еще не был полностью убежден в удобстве distutils2. Это требует

pip install Distutils2

и установить

python -m distutils2.run install

PS

Упаковка никогда не была тривиальной (это можно понять, пытаясь разработать новую), поэтому я полагаю, что многие вещи пошли не так, как надо. Я просто надеюсь, что на этот раз все будет сделано правильно.

Евгений Якимович
источник
4
Итак, как этот ответ устарел? поставлялся ли distutils2 с python 3.3? setuptools умерли и засохли?
Capi Etheriel
Можете дать ссылку на "гайд по состоянию setup.py"? Потому что этот "setup.py пропал!" неправильно. Сейчас 2017 год, и setup.py все еще здесь.
karantan
11

Минимальный пример

from setuptools import setup, find_packages


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

Подробнее в документах

Jozo
источник
5

Взгляните на этот полный пример https://github.com/marcindulak/python-mycli небольшого пакета Python. Он основан на рекомендациях по упаковке из https://packaging.python.org/en/latest/distributing.html , использует setup.py с distutils и, кроме того, показывает, как создавать пакеты RPM и deb.

Ниже приведен файл setup.py проекта (полный исходный код см. В репо):

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

и файл спецификации RPM, который более или менее соответствует рекомендациям по упаковке Fedora / EPEL, может выглядеть так:

# 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
пожалуйста, вместо того, чтобы просто копировать / вставлять ссылки, постарайтесь извлечь значительную часть, которая действительно отвечает на вопрос
fredmaggiowski
5

Я рекомендую файл setup.py из примера проекта Руководства пользователя по упаковке Python .

Руководство пользователя Python Packaging «стремится стать авторитетным ресурсом о том, как упаковывать, публиковать и устанавливать дистрибутивы Python с использованием текущих инструментов».

Раззи Абуисса
источник
2

Вот утилита, которую я написал для создания простого файла (шаблона) setup.py с полезными комментариями и ссылками. Надеюсь, это будет полезно.

Установка

sudo pip install setup-py-cli

Применение

Для создания файла setup.py просто введите терминал.

setup-py

Теперь в текущем каталоге должен появиться файл setup.py .

Создан 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=[]  
)

Содержимое сгенерированного setup.py :

  • автоматически выполняется имя пакета на основе имени текущего каталога.
  • некоторые основные поля для заполнения.
  • поясняющие комментарии и ссылки на полезные ресурсы.
  • автоматически вставляется описание из README.md или пустая строка, если README.md отсутствует .

Вот ссылка на репозиторий. Заливайте бесплатно, чтобы усилить раствор.

вуаля
источник