Чи може хто-небудь пояснити, що 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
s (як правило) не дуже портативні, вони, як правило, генеруються за допомогою таких команд, як ./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 в папці яйце-інформація) назву, версію, опис, інші необхідні установки (зазвичай у .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
для зручності використання та за умовами, але може прийняти будь-яку назву.
Сітон:
Ще одне відоме використання 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
впорався б із усім за вас. На жаль, це не завжди так. Іноді доводиться робити конкретні речі, як-от встановити залежності за допомогою команди підпроцесу , щоб система, яку ви встановлюєте, в потрібному стані для вашого пакету. Спробуйте уникнути цього, ці функції стають заплутаними і часто відрізняються між ОС і рівномірним розподілом .