Может кто-нибудь объяснить, что setup.py
такое и как его можно настроить или использовать?
Может кто-нибудь объяснить, что setup.py
такое и как его можно настроить или использовать?
Ответы:
setup.py
это файл python, который обычно говорит вам, что модуль / пакет, который вы собираетесь установить, был упакован и распространен с Distutils, который является стандартом для распространения модулей Python.
Это позволяет вам легко устанавливать пакеты Python. Часто достаточно написать:
$ pip install .
pip
будет использовать setup.py для установки вашего модуля. Избегайте звонков setup.py
напрямую.
https://docs.python.org/3/installing/index.html#installing-index
setup.py
файла.
Это помогает установить пакет 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
requests
) имеет этот проект, чтобы явным образом привести хороший пример setup.py - github.com/kennethreitz/setup.py
setup.py
это ответ Python на многоплатформенный установщик и make
файл.
Если вы знакомы с установками командной строки, то make && make install
переводится как python setup.py build && python setup.py install
.
Некоторые пакеты являются чистым Python и компилируются только байтами. Другие могут содержать собственный код, для которого потребуется собственный компилятор (например, gcc
или cl
) и модуль интерфейса Python (например, swig
или pyrex
).
python setup.py install
на самом деле запускается python setup.py build
первым (поэтому вам не нужно запускать их отдельно, кроме случаев, когда это необходимо). Я считаю, что make
всегда нужно запускать вручную перед запуском make install
.
make
не требует каких-либо конкретных параметров (или упорядочения): полностью зависит от создателя, Makefile
какие «цели» доступны (и в каком порядке их нужно вызывать). Поскольку «голые» Makefile
(как правило) не очень переносимы, они, как правило, генерируются с помощью таких команд, как ./configure
(autotools) или cmake .
(cmake), и поэтому эти программы сами определяют, нужно ли вам явно запускаться make
раньше make install
или нет.
Если вы загрузили пакет с «setup.py» в корневую папку, вы можете установить его, запустив
python setup.py install
Если вы разрабатываете проект и вам интересно, для чего этот файл полезен, обратитесь к документации Python по написанию сценария установки
setup.py
скрипт Python, который обычно поставляется с библиотеками или программами, написанными на этом языке. Его цель - правильная установка программного обеспечения.
Многие пакеты используют distutils
каркас в сочетании с setup.py
.
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.
Когда вы загружаете пакет с 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
. Выполнено!
Чтобы установить загруженный пакет Python, вы извлекаете архив и запускаете скрипт setup.py внутри:
python setup.py install
Для меня это всегда было странно. Было бы более естественно указать менеджер загрузки при загрузке, как это было бы, например, в Ruby и Nodejs.gem install rails-4.1.1.gem
Менеджер пакетов тоже удобнее, потому что он знаком и надежен. С другой стороны, каждый setup.py
новый, потому что он специфичен для пакета. Это требует веры в соглашение «Я верю, что этот setup.py принимает те же команды, что и другие, которые я использовал в прошлом». Это прискорбный налог на умственную силу воли.
Я не говорю, что рабочий процесс setup.py менее безопасен, чем менеджер пакетов (я понимаю, что Пип просто запускает setup.py внутри), но, конечно, я чувствую, что это странно и раздражающе. Существует гармония для команд, которые все находятся в одном приложении диспетчера пакетов. Вы могли бы даже полюбить это.
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 - если не возвращена ошибка).
Другое использование 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.
Он принимает имя, поэтому всегда можно использовать одну и ту же команду при сборке или установке.
Для простоты setup.py запускается так же, как "__main__"
при вызове функций установки других упомянутых ответов. Внутри setup.py вы должны поместить все необходимое для установки вашего пакета.
В следующих двух разделах обсуждаются две вещи, которые есть во многих модулях setup.py.
Эта функция позволяет вам указывать атрибуты проекта, такие как имя проекта, версия .... Самое главное, эта функция позволяет вам устанавливать другие функции, если они упакованы правильно. См. Эту веб-страницу для примера 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 , чтобы система, в которой вы устанавливаете, находилась в правильном состоянии для вашего пакета. Старайтесь избегать этого, эти функции сбивают с толку и часто отличаются в зависимости от ОС и даже распространения .