Що таке setup.py?


990

Чи може хто-небудь пояснити, що setup.pyтаке і як це можна налаштувати або використовувати?


7
Ерік: Кращі приклади
зведення

1
Мені завжди дивно, як встановити пакет, який ви витягуєте, і запустити сценарій всередині, а не вказувати менеджеру пакунків на завантажене вами. Це було б більш природно. stackoverflow.com/questions/1471994/what-is-setup-py/…
Полковник Паніка

Відповіді:


694

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! Це порушує вашу версію! stackoverflow.com/questions/4324558 / ...
devinbost

2
@MikeS Я точно не знаю, що таке вирішення, але можу сказати вам, що запущена програма setup.py призвела до проблем кошмару, який потребував багато годин очищення. Я здогадуюсь, що будівництво / зв'язування з піп або кондою було б рішенням.
devinbost

3
Ви можете змінити посилання на docs.python.org/3/installing/index.html , що є посиланням на нестандартну документацію, а також було б добре додати посилання на pack.python.org/tutorials/distributing- пакети / # setup-py, де він розширює призначення setup.pyфайлу.
Альваро Гутьєррес Перрес

491

Це допомагає встановити пакунок 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 Приємне пояснення, дякую!
Dinko Пехарь

1
Мені подобається ця відповідь
SW_user2953243

1
@ SW_user2953243 Радий, що ти
вважаєш

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хто "цілі" доступні (і в якому порядку їх потрібно викликати). Оскільки голі Makefiles (як правило) не дуже портативні, вони, як правило, генеруються за допомогою таких команд, як ./configure(autotools) або cmake .(cmake), і саме для цих програм потрібно визначити, чи потрібно явно запускати makeдо цього make installчи ні.
ntninja

3
Мені потрібен хтось, щоб мені сказати, чи потрібно все-таки використовувати setup.py згідно з документами на docs.python.org/3/installing/index.html "Хоча пряме використання distutils припиняється, ... "
Kemin Zhou


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 в папці яйце-інформація) назву, версію, опис, інші необхідні установки (зазвичай у .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.
Палець

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для зручності використання та за умовами, але може прийняти будь-яку назву.

Сітон:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.