приклади setup.py?


88

Після вивчення цієї сторінки:

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

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

Чи може така спільнота вказати мені на якісь добрі приклади?

Відповіді:


61

Повне керівництво написанням setup.pyсценаріїв тут . (з деякими прикладами)

Якщо ви хочете отримати реальний приклад, я можу вказати вам setup.pyсценарії декількох великих проектів. Django's тут , pyglet's тут . Ви можете просто переглянути джерело інших проектів для файлу з назвою setup.py для отримання додаткових прикладів.

Це не прості приклади; підручник посилання я дав є. Вони більш складні, але також більш практичні.


30

Вам може виявитися корисним Посібник з упаковки HitchHiker , навіть якщо він є неповним. Я б розпочав із підручника "Швидкий старт" . Спробуйте також просто переглядати пакети Python в індексі пакетів Python . Просто завантажте tarball, розпакуйте його та подивіться на setup.pyфайл. Або ще краще, лише турбуйтеся про перегляд пакетів, у яких перелічено загальнодоступне сховище вихідного коду, таке як те, яке розміщено на GitHub або BitBucket. Ви обов’язково зіткнетесь з одним на першій сторінці.

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


26

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

Рекомендації щодо інструменту встановлення

  1. Використовуйте pip для встановлення пакетів Python з PyPI.
  2. Використовуйте virtualenv або pyvenv для ізоляції залежностей, залежних від програми, від спільної інсталяції Python.
  3. Використовуйте піп-колесо, щоб створити кеш розподілу коліс, з метою> прискорення подальших інсталяцій.
  4. Якщо ви шукаєте управління повністю інтегрованими міжплатформенними стеками програмного забезпечення, розгляньте можливість побудови (переважно орієнтованої на спільноту веб-розробників) або Hashdist, або conda (обидва переважно орієнтовані на наукове співтовариство).

Рекомендації щодо пакувального інструменту

  1. Використовуйте setuptools для визначення проектів та створення вихідних розподілів.
  2. Для створення коліс використовуйте розширення bdist_wheel setuptools, доступне у проекті колеса. Це особливо корисно, якщо ваш проект містить двійкові розширення.
  3. Використовуйте шпагат для завантаження дистрибутивів до PyPI.

Цей запобіжник постарів, і справді існує план порятунку для світу упаковки пітонів, який називається

колеса шлях

Я цитую pythonwheels.com тут:

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

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

Переваги коліс

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

Повна історія правильної упаковки python (і про колеса) викладена на веб-сайті packaging.python.org


конда-спосіб

Для наукових обчислень (це також рекомендується на упаковці.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? сетуптоули вмирали і в'янули?
Capi Etheriel

Чи можете ви дати посилання на "керівництво щодо стану setup.py"? Тому що ця "setup.py знищена!" невірно. Це 2017 рік і setup.py si все ще тут.
karantan

11

Мінімальний приклад

from setuptools import setup, find_packages


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

Більше інформації в документах


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 .

Ось посилання на сховище. Заповніть безкоштовно, щоб покращити розчин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.