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


992

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


7
Эрик: Лучше привести примеры воедино
Das.Rot

1
Мне всегда было странно, как установить пакет, распаковать его и запустить скрипт внутри, а не указывать диспетчеру пакетов на то, что вы скачали. Это было бы более естественно. stackoverflow.com/questions/1471994/what-is-setup-py/…
полковник Паник

Ответы:


695

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

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

$ pip install . 

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

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


9
Буду признателен, если вы поделитесь своими знаниями о том, как создавать или обрабатывать эти модули? Например, как создать базовый модуль или как протестировать скрипт на ./mymodule/bin, который импортирует из ./mymodule/libs/
Пауло Оливейра

7
@PauloOliveira См. Раздел Распространение модулей Python, в котором описывается Distutils, в частности, см. 2. Написание сценария установки .
Юс

4
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ python setup.py install! Это нарушает ваши версии! stackoverflow.com/questions/4324558/…
devinbost

2
@MikeS Я не знаю наверняка, каков обходной путь, но я могу сказать вам, что запуск setup.py привел меня к кошмарным проблемам, которые требовали многочасовой очистки. Я предполагаю, что построение / связывание с pip или conda было бы решением.
Devinbost

3
Вы можете изменить ссылку на docs.python.org/3/install/index.html , которая является ссылкой на устаревшую документацию, а также было бы хорошо добавить ссылку на packaging.python.org/tutorials/distributing- packages / # setup-py, где указывается назначение setup.pyфайла.
Альваро Гутьеррес Перес

494

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

Это делает подобную работу pip, и easy_installт.д.,


С помощью setup.py

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

Пакет - папка / каталог, содержащий __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='foomail@foo.com',
   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='foomail@foo.com',
   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='foomail@foo.com',
   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


12
Кеннет Рейтц (автор почтенного requests) имеет этот проект, чтобы явным образом привести хороший пример setup.py - github.com/kennethreitz/setup.py
boweeb

Как насчет подпакетов, то есть папок с модулями внутри пакета?
Fhchl

1
@ kmario23 Хорошее объяснение, спасибо!
Динко Пехар

1
Мне нравится этот ответ
SW_user2953243

1
@ SW_user2953243 Я рад, что вы нашли это полезным :)
kmario23

98

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

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

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


1
Таким образом, в соответствии с приведенной выше аналогией, если сборка модуля по какой-то причине не удалась, я бы повозился со скриптом setup.py ... правильно?
MonaLisaOverdrive

1
Да, там также могут быть некоторые файлы конфигурации, которые вы можете посмотреть.
Whatnick

3
Поправь меня, если я ошибаюсь, но я считаю, что между ними есть небольшая разница. python setup.py install на самом деле запускается python setup.py buildпервым (поэтому вам не нужно запускать их отдельно, кроме случаев, когда это необходимо). Я считаю, что makeвсегда нужно запускать вручную перед запуском make install.
Joelostblom

6
@cheflo На самом деле makeне требует каких-либо конкретных параметров (или упорядочения): полностью зависит от создателя, Makefileкакие «цели» доступны (и в каком порядке их нужно вызывать). Поскольку «голые» Makefile(как правило) не очень переносимы, они, как правило, генерируются с помощью таких команд, как ./configure(autotools) или cmake .(cmake), и поэтому эти программы сами определяют, нужно ли вам явно запускаться makeраньше make installили нет.
ntninja

3
Мне нужен кто-то, кто скажет мне, следует ли нам по-прежнему использовать файл setup.py в соответствии с документами на docs.python.org/3/install/index.html "В то время как прямое использование distutils постепенно прекращается, ... "
Кемин Чжоу


20

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

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

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


19

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

Спасибо за python setup.py --help-commands. Очень полезно при копании в setup.py.
Palec

8

Когда вы загружаете пакет с 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. Выполнено!


7

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

python setup.py install

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

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

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


1
Тогда вы можете использовать easy_install или аналогичный. Кстати, в Python есть яйца, похожие на рубиновые.
Павел Шимерда

7

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

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

Модули:

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

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

Этот метод часто используется, когда pipне удастся. Например, если правильная версия Python нужного пакета недоступна, pipвозможно, из-за того, что он больше не поддерживается, загрузка исходного кода и запуск 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 в исполняемые файлы. Это позволяет включать многие команды, такие как описания, имена, значки, пакеты, исключать 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.

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


6

Для простоты 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 , чтобы система, в которой вы устанавливаете, находилась в правильном состоянии для вашего пакета. Старайтесь избегать этого, эти функции сбивают с толку и часто отличаются в зависимости от ОС и даже распространения .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.