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