Co to jest setup.py?


990

Czy ktoś może wyjaśnić, co to setup.pyjest i jak można go skonfigurować lub używać?


7
Eric: Lepsze przykłady zestawiania wszystkiego byłyby korzystne
Das.Rot

1
Dla mnie zawsze wydawało się dziwne, jak zainstalować pakiet, który go rozpakowałeś i uruchomić skrypt w środku, zamiast wskazywać menedżerowi pakietów na to, co pobrałeś. To byłoby bardziej naturalne. stackoverflow.com/questions/1471994/what-is-setup-py/…
Pułkownik Panika

Odpowiedzi:


694

setup.py to plik Pythona, który zwykle informuje, że moduł / pakiet, który zamierzasz zainstalować, został spakowany i rozpowszechniony z Distutils, który jest standardem dystrybucji modułów Pythona.

Umożliwia to łatwą instalację pakietów Python. Często wystarczy napisać:

$ pip install . 

pipużyje setup.py, aby zainstalować moduł. Unikaj dzwonienia setup.pybezpośrednio.

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


9
Byłbym wdzięczny, jeśli podzielisz się swoją wiedzą na temat tworzenia lub obsługi tych modułów? Na przykład, jak utworzyć podstawowy moduł lub przetestować skrypt na ./mymodule/bin, który importuje z ./mymodule/libs/
Paulo Oliveira,

7
@PauloOliveira Zobacz Dystrybucja modułów Pythona, która opisuje Distutils, szczególnie zajrzyj do 2. Pisanie skryptu instalacyjnego .
Yus

4
NIGDY NIE UŻYWAJ instalacji python setup.py! To psuje twoją wersję! stackoverflow.com/questions/4324558/…
devinbost

2
@MikeS Nie wiem na pewno, co to jest, ale mogę powiedzieć, że uruchomienie setup.py doprowadziło mnie do problemów z koszmarem, które wymagały wielu godzin czyszczenia. Domyślam się, że rozwiązaniem byłoby budowanie / wiązanie z pipem lub condą.
devinbost

3
Możesz zmienić link na docs.python.org/3/installing/index.html , który jest nieaktualnym linkiem do dokumentacji, a także dobrze byłoby dodać link do package.python.org/tutorials/distributing- pakiety / # setup-py, gdzie spełnia przeznaczenie setup.pypliku.
Alvaro Gutierrez Perez

491

Pomaga zainstalować pakiet Pythona foona twoim komputerze (może być również w virtualenv), abyś mógł zaimportować pakiet fooz innych projektów, a także z [I] monitów Pythona.

Czyni podobną pracę pip, easy_installitd.,


Za pomocą setup.py

Zacznijmy od kilku definicji:

Pakiet - folder / katalog zawierający __init__.pyplik.
Moduł - prawidłowy plik python z .pyrozszerzeniem.
Dystrybucja - jak jeden pakiet odnosi się do innych pakietów i modułów .

Powiedzmy, że chcesz zainstalować pakiet o nazwie foo. To robisz

$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install

Zamiast tego, jeśli nie chcesz go instalować, ale nadal chcesz go używać. Więc zrób

$ python setup.py develop  

To polecenie utworzy dowiązania symboliczne do katalogu źródłowego w pakietach witryn zamiast kopiowania. Z tego powodu jest dość szybki (szczególnie w przypadku dużych paczek).


Tworzenie setup.py

Jeśli masz takie drzewo pakietów,

foo
├── foo
   ├── data_struct.py
   ├── __init__.py
   └── internals.py
├── README
├── requirements.txt
└── setup.py

Następnie wykonaj następujące czynności w setup.pyskrypcie, aby można go było zainstalować na niektórych komputerach:

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
)

Zamiast tego, jeśli twoje drzewo pakietów jest bardziej złożone, jak to poniżej:

foo
├── foo
   ├── data_struct.py
   ├── __init__.py
   └── internals.py
├── README
├── requirements.txt
├── scripts
   ├── cool
   └── skype
└── setup.py

Wtedy twój setup.pyw tym przypadku wyglądałby tak:

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',
           ]
)

Dodaj więcej rzeczy do ( setup.py) i spraw, by było przyzwoite:

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_descriptionJest stosowany w pypi.org jako opis README z pakietu.


I na koniec, możesz teraz przesłać swój pakiet na PyPi.org , aby inni mogli go zainstalować przy użyciu pip install yourpackage.

Pierwszym krokiem jest zdobycie nazwy i przestrzeni pakietu w pypi przy użyciu:

$ python setup.py register

Po zarejestrowaniu nazwy paczki nikt nie może jej zażądać ani z niej korzystać. Po udanej rejestracji musisz tam przesłać swój pakiet (do chmury),

$ python setup.py upload

Opcjonalnie możesz również podpisać paczkę za GPGpomocą,

$ python setup.py --sign upload

Bonus : Zobacz próbkę setup.pyz prawdziwego projektu tutaj:torchvision-setup.py


12
Kenneth Reitz (autor czcigodnego requests) ma ten projekt, aby wyraźnie dać dobry przykład setup.py - github.com/kennethreitz/setup.py
boweeb

Co z podpakietami, tj. Folderami z modułami w pakiecie?
fhchl

1
@ kmario23 Ładne wyjaśnienie, dziękuję!
Dinko Pehar

1
Podoba mi się ta odpowiedź
SW_user2953243

1
@ SW_user2953243 Cieszę się, że okaże się przydatny :)
kmario23

98

setup.pyjest odpowiedzią Pythona na wieloplatformowy instalator i makeplik.

Jeśli znasz instalacje z wiersza poleceń, to znaczy make && make installto python setup.py build && python setup.py install.

Niektóre pakiety są czystym Pythonem i są kompilowane tylko bajtowo. Inne mogą zawierać natywny kod, który będzie wymagał natywnego kompilatora (jak gcclub cl) i modułu interfejsu Python (jak swiglub pyrex).


1
Więc zgodnie z powyższą analogią, jeśli z jakiegoś powodu kompilacja modułu nie powiodła się, majstrowałem przy skrypcie setup.py ... prawda?
MonaLisaOverdrive

1
Tak, mogą być też dostępne pliki konfiguracyjne.
whatnick,

3
Popraw mnie, jeśli się mylę, ale wierzę, że jest między nimi niewielka różnica. python setup.py install faktycznie działa jako python setup.py buildpierwszy (więc nie musisz uruchamiać ich osobno, chyba że w szczególnych przypadkach). Uważam, że makezawsze należy uruchomić ręcznie przed uruchomieniem make install.
joelostblom

6
@cheflo Właściwie makenie wymaga żadnych konkretnych parametrów (ani zamawiania): od twórcy zależy, Makefilektóre „cele” są dostępne (i w jakiej kolejności należy je wywoływać). Ponieważ gołe Makefiles (zwykle) nie są bardzo przenośne, zwykle są generowane za pomocą poleceń takich jak ./configure(autotools) lub cmake .(cmake) i to od nich zależy, czy te programy będą musiały jawnie uruchamiać się makewcześniej, make installczy nie.
ntninja

3
Potrzebuję kogoś, kto powie mi, czy nadal powinniśmy używać setup.py zgodnie z dokumentacją na docs.python.org/3/installing/index.html „Podczas gdy bezpośrednie stosowanie distutils jest stopniowo wycofywane, ... „
Kemin Zhou,


20

setup.pyto skrypt w języku Python, który jest zwykle dostarczany z bibliotekami lub programami, napisany w tym języku. Jego celem jest poprawna instalacja oprogramowania.

Wiele pakietów korzysta z distutilsframeworka w połączeniu z setup.py.

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


19

Plik setup.py może być używany w dwóch scenariuszach. Najpierw chcesz zainstalować pakiet Python. Po drugie, chcesz stworzyć własny pakiet Python. Zwykle standardowy pakiet Pythona zawiera kilka ważnych plików, takich jak setup.py, setup.cfg i Manifest.in. Podczas tworzenia pakietu Python te trzy pliki określają (zawartość w PKG-INFO w folderze egg-info) nazwę, wersję, opis, inne wymagane instalacje (zwykle w pliku .txt) i kilka innych parametrów. plik setup.cfg jest odczytywany przez plik setup.py podczas tworzenia pakietu (może to być plik tar.gz). Manifest.in to miejsce, w którym możesz zdefiniować, co powinno być zawarte w twoim pakiecie. W każdym razie możesz robić wiele rzeczy za pomocą setup.py jak

python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo]  (to upload package to pypi or local repo)

Istnieje wiele innych poleceń, których można użyć w pliku setup.py. o pomoc

python setup.py --help-commands

Dzięki za python setup.py --help-commands. Bardzo przydatne podczas wczytywania pliku setup.py.
Palec

8

Podczas pobierania pakietu z setup.pyotwartym terminalem (Mac, Linux) lub wierszem poleceń (Windows). Używając cd i przytrzymując przycisk Tab, ustaw ścieżkę do folderu, w którym pobrałeś plik i gdzie jest setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Naciśnij Enter, powinieneś zobaczyć coś takiego:

iMac:pakagefolderwithsetupfile user$

Następnie wpisz po tym python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Prasa enter. Gotowy!


7

Aby zainstalować pobrany pakiet Python, rozpakuj archiwum i uruchom skrypt setup.py wewnątrz:

python setup.py install

Dla mnie zawsze wydawało się to dziwne. Bardziej naturalne byłoby wskazanie menedżera pakietów na pobieranie, tak jak na przykład w Ruby i Nodejs.gem install rails-4.1.1.gem

Menedżer pakietów jest również wygodniejszy, ponieważ jest znajomy i niezawodny. Z drugiej strony każdy setup.pyjest nowatorski, ponieważ jest specyficzny dla pakietu. Wymaga wiary w konwencję „Ufam, że setup.py przyjmuje takie same polecenia, jak inne, których używałem w przeszłości”. To godne pożałowania podatek od siły woli.

Nie twierdzę, że przepływ pracy setup.py jest mniej bezpieczny niż menedżer pakietów (rozumiem, że Pip po prostu uruchamia setup.py w środku), ale z pewnością czuję się dziwnie i denerwuje. Wszystkie komendy są zgodne z tą samą aplikacją do zarządzania pakietami. Możesz nawet polubić to.


1
Następnie możesz użyć easy_install lub podobnego. Btw, Python ma jajka, coś w rodzaju rubinowych klejnotów.
Pavel Šimerda

7

setup.pyjest plikiem Python jak każdy inny. Może przyjmować dowolne nazwy, z wyjątkiem konwencji, że jest setup.pytak nazywany, aby nie było innej procedury dla każdego skryptu.

Najczęściej setup.pysłuży do instalacji modułu Python, ale serwer służy również do innych celów:

Moduły:

Być może jest to najbardziej znane użycie setup.pymodułów. Chociaż można je zainstalować przy użyciu pip, stare wersje Pythona nie zawierały pipdomyślnie i musiały zostać zainstalowane osobno.

Jeśli chcesz zainstalować moduł, ale nie chcesz go instalować pip, prawie jedyną alternatywą było zainstalowanie modułu z setup.pypliku. Można to osiągnąć poprzez python setup.py install. To byłoby zainstalować moduł Pythona do słownika głównego (bez pip, easy_installect).

Ta metoda jest często używana, gdy pipzawiedzie. Na przykład, jeśli poprawna wersja żądanego pakietu w Pythonie nie jest dostępna, pipbyć może dlatego, że nie jest już utrzymywana, pobieranie źródła i uruchamianie działałoby python setup.py installtak samo, z wyjątkiem sytuacji, gdy wymagane są skompilowane pliki binarne (ale zignoruje Wersja Python - chyba że zwracany jest błąd).

Innym zastosowaniem setup.pyjest instalacja pakietu ze źródła. Jeśli moduł jest wciąż w fazie rozwoju, pliki kół nie będą dostępne, a jedynym sposobem instalacji jest instalacja bezpośrednio ze źródła.

Budowanie rozszerzeń języka Python:

Po zbudowaniu modułu można go przekonwertować na moduł gotowy do dystrybucji za pomocą skryptu instalacyjnego distutils . Po zbudowaniu można je zainstalować za pomocą powyższego polecenia.

Skrypt instalacyjny jest łatwy do zbudowania, a po prawidłowym skonfigurowaniu pliku można go skompilować, uruchamiając python setup.py build(patrz link do wszystkich poleceń).

Po raz kolejny został nazwany setup.pydla łatwości użycia i zgodnie z konwencją, ale może przyjmować dowolną nazwę.

Cython:

Innym znanym zastosowaniem setup.pyplików są skompilowane rozszerzenia. Wymagają one skryptu instalacyjnego z wartościami zdefiniowanymi przez użytkownika. Umożliwiają szybkie (ale po skompilowaniu są zależne od platformy) wykonanie. Oto prosty przykład z dokumentacji :

from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = 'Hello world app',
    ext_modules = cythonize("hello.pyx"),
)

Można to skompilować za pomocą python setup.py build

Cx_Freeze:

Kolejnym modułem wymagającym skryptu instalacyjnego jest cx_Freeze. Konwertuje to skrypt Pythona na pliki wykonywalne. Pozwala to na dołączenie wielu poleceń, takich jak opisy, nazwy, ikony, pakiety, wykluczenie ect, a po uruchomieniu spowoduje utworzenie aplikacji do dystrybucji. Przykład z dokumentacji :

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)])

Można to skompilować za pomocą python setup.py build.

Czym jest setup.pyplik?

Po prostu jest to skrypt, który buduje lub konfiguruje coś w środowisku Python.

Rozproszony pakiet powinien zawierać tylko jeden skrypt instalacyjny, ale nierzadko łączenie kilku razem w jeden skrypt instalacyjny. Zauważ, że często dotyczy to, distutilsale nie zawsze (jak pokazałem w ostatnim przykładzie). Należy pamiętać, że po prostu konfiguruje pakiet / skrypt Pythona.

Pobiera nazwę, więc to samo polecenie może być zawsze użyte podczas budowania lub instalowania.


6

Aby to uprościć, plik setup.py jest uruchamiany tak, jak "__main__"podczas wywoływania funkcji instalacyjnych inne wymienione odpowiedzi. W pliku setup.py powinieneś umieścić wszystko, co potrzebne do zainstalowania pakietu.

Typowe funkcje setup.py

Poniższe dwie sekcje omawiają dwie rzeczy, które ma wiele modułów setup.py.

setuptools.setup

Ta funkcja pozwala określić atrybuty projektu, takie jak nazwa projektu, wersja .... Co najważniejsze, funkcja ta umożliwia zainstalowanie innych funkcji, jeśli są one odpowiednio zapakowane. Zobacz tę stronę internetową, aby zobaczyć przykład setuptools.setup

Te atrybuty setuptools.setup umożliwiają instalację następujących typów pakietów:

  • Pakiety zaimportowane do projektu i wymienione w PyPI przy użyciu setuptools.findpackages :

    packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

  • Pakiety nie są w PyPI , ale można je pobrać z adresu URL za pomocą link_zależności

    dependency_links=["http://peak.telecommunity.com/snapshots/",]

Funkcje niestandardowe

W idealnym świecie setuptools.setupporadziłby sobie ze wszystkim. Niestety nie zawsze tak jest. Czasami musisz wykonać określone czynności, takie jak instalowanie zależności za pomocą komendy subprocess , aby system, na którym instalujesz, był w odpowiednim stanie dla pakietu. Staraj się tego unikać, funkcje te stają się mylące i często różnią się między systemem operacyjnym, a nawet dystrybucją .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.