Что такое setup.py?

Может кто-нибудь объяснить, что такое setup.py и как его можно настроить или использовать?

Ответ 1

setup.py - это файл Python, который обычно сообщает вам, что модуль/пакет, который вы собираетесь установить, был упакован и распространен вместе с Distutils, который является стандартом для распространения модулей Python.

Это позволяет вам легко устанавливать пакеты Python. Часто достаточно написать:

$ pip install . 

pip будет использовать setup.py для установки вашего модуля. Избегайте прямого вызова setup.py.

https://docs.python.org/3/installing/index.html#installing-index

Ответ 2

Это помогает установить пакет python foo на ваш компьютер (также может быть в virtualenv), чтобы вы могли импортировать пакет foo из других проектов, а также из приглашений [I] Python.

Он выполняет аналогичную работу pip, easy_install и т.д.


Использование setup.py

Начнем с некоторых определений:

Пакет - папка/каталог, содержащий файл __init__.py.
Module - действительный файл python с расширением .py.
Распространение. Как один пакет относится к другим пакетам и модулям.

Скажем, вы хотите установить пакет с именем foo. Тогда вы это сделаете,

$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install

Вместо этого, если вы не хотите на самом деле его устанавливать, но все равно хотите использовать его. Тогда сделайте,

$ python setup.py develop  

Эта команда создаст символические ссылки в исходный каталог в пакетах сайта вместо копирования. Из-за этого он довольно быстро (особенно для больших пакетов).


Создание setup.py

Если у вас есть дерево пакетов,

foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
└── setup.py

Затем вы выполните следующие действия в сценарии setup.py чтобы его можно было установить на какой-либо машине:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

Вместо этого, если ваше дерево пакетов более сложное, как показано ниже:

foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
├── scripts
│   ├── cool
│   └── skype
└── setup.py

Тогда ваш setup.py в этом случае будет выглядеть так:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Добавьте еще кое-что (setup.py) и сделайте его приличным:

from setuptools import setup

with open("README", 'r') as f:
    long_description = f.read()

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   license="MIT",
   long_description=long_description,
   author='Man Foo',
   author_email='[email protected]',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

long_description используется в pypi.org как описание вашего пакета README.


И, наконец, теперь вы готовы загрузить свой пакет на PyPi.org, чтобы другие могли установить ваш пакет, используя pip install yourpackage.

Первый шаг - заявить имя и пространство вашего пакета в pypi, используя:

$ python setup.py register

После регистрации имени вашего пакета никто не может требовать или использовать его. После успешной регистрации вы должны загрузить свой пакет туда (в облако),

$ python setup.py upload

При желании вы также можете подписывать свой пакет с GPG,

$ python setup.py --sign upload

Бонус: см. Пример setup.py из реального проекта здесь: torchvision-setup.py

Ответ 3

setup.py - ответ Python на многоплатформенный установщик и make файл.

Если вы знакомы с установками командной строки, то make && make install переводит на python setup.py build && python setup.py install.

Некоторые пакеты являются чистым Python и только байт скомпилирован. Другие могут содержать собственный код, для которого потребуется собственный компилятор (например, gcc или cl) и модуль сопряжения Python (например, swig или pyrex).

Ответ 5

setup.py - это Python script, который обычно поставляется с библиотеками или программами, написанными на этом языке. Целью является правильная установка программного обеспечения.

Многие пакеты используют фреймворк distutils в сочетании с setup.py.

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

Ответ 6

setup.py можно использовать в двух сценариях. Во-первых, вы хотите установить пакет Python. Во-вторых, вы хотите создать свой собственный пакет Python. Обычно в стандартном пакете Python есть несколько важных файлов, таких как setup.py, setup.cfg и Manifest.in. Когда вы создаете пакет Python, эти три файла будут определять (содержимое в PKG-INFO в папке с информацией о яйцах), версию, описание, другие необходимые установки (обычно в .txt файл) и несколько других параметров. setup.cfg считывается setup.py, пока создается пакет (может быть tar.gz). Manifest.in - это то, где вы можете определить, что должно быть включено в ваш пакет. В любом случае вы можете сделать кучу вещей, используя setup.py, например

python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo]  (to upload package to pypi or local repo)

Существует множество других команд, которые можно использовать с setup.py. для справки

python setup.py --help-commands

Ответ 7

Когда вы загружаете пакет с setup.py, откройте свой терминал (Mac, Linux) или командную строку (Windows). Используя cd и помогая вам с кнопкой Tab, установите путь к папке, в которую вы загрузили файл, и где есть setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Нажмите enter, вы должны увидеть что-то вроде этого:

iMac:pakagefolderwithsetupfile user$

Затем введите после этого python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Нажмите enter. Готово!

Ответ 8

Чтобы установить пакет Python, который вы загрузили, вы извлекаете архив и запускаете setup.py script внутри:

python setup.py install

Для меня это всегда было странно. Было бы более естественно указать диспетчер пакетов при загрузке, как это было бы в Ruby и Nodejs, например. gem install rails-4.1.1.gem

Менеджер пакетов более удобен, потому что он знаком и надежным. С другой стороны, каждый setup.py является новым, потому что он специфичен для пакета. Он требует веры в соглашение "Я доверяю этой установке .py принимает те же команды, что и другие, которые я использовал в прошлом". Это прискорбный налог на умственную волю.

Я не говорю, что рабочий процесс setup.py менее безопасен, чем диспетчер пакетов (я понимаю, что Pip просто запускает setup.py внутри), но, конечно, я чувствую, что это awkard и jarring. Там есть гармония, чтобы командовать всем присутствием одного и того же приложения диспетчера пакетов. Вы можете даже полюбить его.

Ответ 9

setup.py - это файл Python, как любой другой. Он может принимать любое имя, кроме как по соглашению, оно называется setup.py так что с каждым скриптом не существует другой процедуры.

Чаще всего setup.py используется для установки модуля Python, но для других целей сервера:

Модули:

Возможно, это самое известное использование setup.py в модулях. Хотя они могут быть установлены с использованием pip, старые версии Python не включали в себя pip по умолчанию, и их нужно было устанавливать отдельно.

Если вы хотите установить модуль, но не хотите устанавливать pip, то единственной альтернативой было бы установить модуль из файла setup.py. Это может быть достигнуто с помощью python setup.py install. Это установит модуль Python в корневой словарь (без pip, easy_install ect).

Этот метод часто используется, когда pip не работает. Например, если правильная версия Python нужного пакета недоступна через pip возможно, потому что она больше не поддерживается, загрузка исходного файла и запуск python setup.py install будет выполнять то же самое, за исключением случаев, когда требуются скомпилированные двоичные файлы, (но игнорирует версию Python -unless, возвращается ошибка).

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

Построение расширений Python:

Когда модуль был построен, он может быть преобразован в модуль, готовый к распространению, используя скрипт настройки distutils. После их сборки они могут быть установлены с помощью команды выше.

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

Еще раз он называется setup.py для простоты использования и по соглашению, но может принимать любое имя.

Cython:

Другое известное использование файлов setup.py включает скомпилированные расширения. Для них требуется сценарий установки с определенными пользователем значениями. Они позволяют быстро (но когда-то скомпилированные являются зависимыми от платформы). Вот простой пример из документации:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = 'Hello world app',
    ext_modules = cythonize("hello.pyx"),
)

Это можно скомпилировать с помощью python setup.py build

Cx_Freeze:

Другим модулем, требующим сценария установки, является cx_Freeze. Это преобразует скрипт Python в исполняемые файлы. Это позволяет использовать многие команды, такие как описания, имена, значки, пакеты, исключить ect и один раз запустить выдающее приложение. Пример из документации:

import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]} 

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "guifoo",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("guifoo.py", base=base)])

Это можно скомпилировать с помощью python setup.py build.

Итак, что такое файл setup.py?

Весьма просто это скрипт, который создает или настраивает что-то в среде Python.

Пакет при распространении должен содержать только один сценарий установки, но нередко объединяться несколько в один сценарий установки. Обратите внимание, что это часто включает distutils но не всегда (как я показал в моем последнем примере). То, что нужно запомнить, просто каким-то образом настраивает пакет/скрипт Python.

Он принимает имя, поэтому при создании или установке всегда можно использовать ту же самую команду.

Ответ 10

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

Общие функции setup.py

В следующих двух разделах обсуждаются две вещи, которые есть во многих модулях setup.py.

setuptools.setup

Эта функция позволяет вам указывать атрибуты проекта, такие как имя проекта, версия.... Наиболее важно, эта функция позволяет вам устанавливать другие функции, если они упакованы должным образом. Смотрите эту веб-страницу для примера setuptools.setup

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

  • Пакеты, которые импортированы в ваш проект и перечислены в PyPI с помощью setuptools.findpackages:

    packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

  • Пакеты не в PyPI, но могут быть загружены с URL-адреса с использованием зависимостей

    dependency_links=["http://peak.telecommunity.com/snapshots/",]

Пользовательские функции

В идеальном мире, setuptools.setup будет обрабатывать все для вас. К сожалению, это не всегда так. Иногда вам нужно выполнить определенные действия, такие как установка зависимостей с помощью команды subprocess, чтобы система, в которой вы устанавливаете, находилась в правильном состоянии для вашего пакета. Старайтесь избегать этого, эти функции сбивают с толку и часто отличаются в зависимости от ОС и даже распространения.