Czy ktoś może wyjaśnić, co to setup.py
jest i jak można go skonfigurować lub używać?
Czy ktoś może wyjaśnić, co to setup.py
jest i jak można go skonfigurować lub używać?
Odpowiedzi:
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 .
pip
użyje setup.py, aby zainstalować moduł. Unikaj dzwonienia setup.py
bezpośrednio.
https://docs.python.org/3/installing/index.html#installing-index
setup.py
pliku.
Pomaga zainstalować pakiet Pythona foo
na twoim komputerze (może być również w virtualenv
), abyś mógł zaimportować pakiet foo
z innych projektów, a także z [I] monitów Pythona.
Czyni podobną pracę pip
, easy_install
itd.,
Za pomocą setup.py
Zacznijmy od kilku definicji:
Pakiet - folder / katalog zawierający __init__.py
plik.
Moduł - prawidłowy plik python z .py
rozszerzeniem.
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.py
skrypcie, 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.py
w 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_description
Jest 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 GPG
pomocą,
$ python setup.py --sign upload
Bonus : Zobacz próbkę setup.py
z prawdziwego projektu tutaj:torchvision-setup.py
requests
) ma ten projekt, aby wyraźnie dać dobry przykład setup.py - github.com/kennethreitz/setup.py
setup.py
jest odpowiedzią Pythona na wieloplatformowy instalator i make
plik.
Jeśli znasz instalacje z wiersza poleceń, to znaczy make && make install
to 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 gcc
lub cl
) i modułu interfejsu Python (jak swig
lub pyrex
).
python setup.py install
faktycznie działa jako python setup.py build
pierwszy (więc nie musisz uruchamiać ich osobno, chyba że w szczególnych przypadkach). Uważam, że make
zawsze należy uruchomić ręcznie przed uruchomieniem make install
.
make
nie wymaga żadnych konkretnych parametrów (ani zamawiania): od twórcy zależy, Makefile
które „cele” są dostępne (i w jakiej kolejności należy je wywoływać). Ponieważ gołe Makefile
s (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ę make
wcześniej, make install
czy nie.
Jeśli pobrałeś pakiet, który ma „setup.py” w folderze głównym, możesz go zainstalować, uruchamiając
python setup.py install
Jeśli opracowujesz projekt i zastanawiasz się, do czego ten plik jest przydatny, sprawdź dokumentację Pythona podczas pisania skryptu instalacyjnego
setup.py
to 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 distutils
frameworka w połączeniu z setup.py
.
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
python setup.py --help-commands
. Bardzo przydatne podczas wczytywania pliku setup.py.
Podczas pobierania pakietu z setup.py
otwartym 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!
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.py
jest 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.
setup.py
jest plikiem Python jak każdy inny. Może przyjmować dowolne nazwy, z wyjątkiem konwencji, że jest setup.py
tak nazywany, aby nie było innej procedury dla każdego skryptu.
Najczęściej setup.py
sł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.py
modułów. Chociaż można je zainstalować przy użyciu pip
, stare wersje Pythona nie zawierały pip
domyś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.py
pliku. Można to osiągnąć poprzez python setup.py install
. To byłoby zainstalować moduł Pythona do słownika głównego (bez pip
, easy_install
ect).
Ta metoda jest często używana, gdy pip
zawiedzie. Na przykład, jeśli poprawna wersja żądanego pakietu w Pythonie nie jest dostępna, pip
być może dlatego, że nie jest już utrzymywana, pobieranie źródła i uruchamianie działałoby python setup.py install
tak samo, z wyjątkiem sytuacji, gdy wymagane są skompilowane pliki binarne (ale zignoruje Wersja Python - chyba że zwracany jest błąd).
Innym zastosowaniem setup.py
jest 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.py
dla łatwości użycia i zgodnie z konwencją, ale może przyjmować dowolną nazwę.
Cython:
Innym znanym zastosowaniem setup.py
plikó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.py
plik?
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, distutils
ale 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.
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.
Poniższe dwie sekcje omawiają dwie rzeczy, które ma wiele modułów setup.py.
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/",]
W idealnym świecie setuptools.setup
poradził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ą .