it-roy-ru.com

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

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

683
Software Enthusiastic

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

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

$ python setup.py install

и модуль установится сам.

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

469
Silfverstrom

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

Аналогично pip, easy_install и т.д.


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

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

Package - папка/каталог, содержащий файл __init__.py.
Модуль - Действительный файл 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

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

259
kmario23

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

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

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

81
whatnick

Если вы загрузили пакет с файлом «setup.py» в корневую папку, вы можете установить его, запустив

python setup.py install

Если вы разрабатываете проект и вам интересно, для чего этот файл полезен, проверьте документация Python по написанию скрипта установки

44
Pēteris Caune

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

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

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

17
Ferdinand Beyer

setup.py можно использовать в двух сценариях. Во-первых, вы хотите установить пакет Python. Во-вторых, вы хотите создать свой собственный пакет Python. Обычно стандартный пакет Python содержит пару важных файлов, таких как setup.py, setup.cfg и Manifest.in. Когда вы создаете пакет Python, эти три файла будут определять (содержимое в PKG-INFO в папке Egg-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
14
Avichal Badaya

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

python setup.py install

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

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

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

6
Colonel Panic

При загрузке пакета с помощью 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. Готово!

6
G M

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

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

Модули:

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

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

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

Другое использование 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 в исполняемые файлы. Это позволяет включать многие команды, такие как описания, имена, значки, пакеты, исключать и т.д., И после запуска создаст распространяемое приложение. Пример из документации :

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. 

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

1
Simon

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

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

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

setuptools.setup

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

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

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

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

  • Пакеты не находятся в PyPI , но могут быть загружены с URL с помощью dependency_links

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

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

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

0
user4757074