Подтвердить что ты не робот

Примеры setup.py?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

ПРОЧИТАЙТЕ ЭТО ПЕРВЫЙ https://packaging.python.org/en/latest/current.html

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

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

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

  • Используйте setuptools для определения проектов и создания распределений источников.
  • Используйте расширение btist_wheel setuptools, доступное из проекта колеса для создания колес. Это особенно полезно, если ваш проект содержит двоичные расширения.
  • Используйте шпагат для загрузки дистрибутивов в PyPI.

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

путь колес

I qoute pythonwheels.com здесь:

Что такое колеса?

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

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

  • Более быстрая установка для чистых пакетов python и native C.
  • Предотвращает выполнение произвольного кода для установки. (Avoids setup.py)
  • Установка расширения C не требует компилятора в Windows или OS X.
  • Позволяет лучше кэшировать для тестирования и непрерывного интеграция.
  • Создает .pyc файлы как часть установки для обеспечения они соответствуют используемому интерпретатору python.
  • Более последовательная установка между платформами и машинами.

Полная история правильной упаковки python (и о колесах) описана в packaging.python.org


conda way

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

Конда может быть установлена ​​в пользовательскую папку (без прав суперпользователя) и работает как магия с помощью

Конда установка

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


яйцо путь

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

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

Эта цитата взята из руководства по состоянию setup.py и по-прежнему применяется:

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

Я добавляю еще одну точку (от меня)

  • колеса

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

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

from distutils.core import setup

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

from setuptools import setup

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

Теперь согласно руководству

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

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

устаревшие setuptools должны быть заменены на distutils2, который "будет частью стандартной библиотеки в Python 3.3". Должен сказать, мне нравились настройки инструментов и яиц и еще не были полностью уверены в удобстве distutils2. Для этого требуется

pip install Distutils2

и установить

python -m distutils2.run install

Забастовкa >

PS

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

Ответ 4

Здесь вы найдете самый простой пример использования distutils и setup.py:

https://docs.python.org/2/distutils/introduction.html#distutils-simple-example

Это предполагает, что весь ваш код находится в одном файле и сообщает, как упаковать проект, содержащий один модуль.

Ответ 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='[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,
      )

и и файл спецификации 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 <[email protected]> - 0.0.1-1
- initial version

Ответ 6

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

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