Setup.py dosyası nedir?


990

Herkes ne setup.pyolduğunu ve nasıl yapılandırılabileceğini veya kullanılabileceğini açıklayabilir mi?


7
Eric: Her şeyi bir araya getiren daha iyi örnekler faydalı olurdu
Das.Rot

1
Bana göre, indirdiğiniz pakete bir paket yöneticisini işaret etmek yerine, ayıkladığınız paketi nasıl kuracağınız ve içerideki betiği nasıl çalıştıracağınız her zaman garip geliyordu. Bu daha doğal olurdu. stackoverflow.com/questions/1471994/what-is-setup-py/…
Albay Panik

Yanıtlar:


694

setup.py genellikle yüklemek üzere olduğunuz modülün / paketin Python Modüllerini dağıtmak için standart olan Distutils ile paketlendiğini ve dağıtıldığını söyleyen bir python dosyasıdır.

Bu, Python paketlerini kolayca yüklemenizi sağlar. Genellikle yazmak yeterlidir:

$ pip install . 

pipmodülünüzü kurmak için setup.py komutunu kullanır. setup.pyDoğrudan aramaktan kaçının .

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


9
Bu modülleri nasıl oluşturacağınız veya işleyeceğiniz hakkındaki bilginizi paylaşırsanız memnun olurum? Örneğin, temel bir modülün nasıl oluşturulacağı veya ./mymodule/bin üzerinde ./mymodule/libs/ adresinden içe aktarılan bir komut dosyasının nasıl test edileceği
Paulo Oliveira

7
@PauloOliveira Bkz. Distutils'i açıklayan Python Modüllerini Dağıtma , özellikle 2. Kurulum Komut Dosyasını Yazma konusuna bakın .
Yous

4
ASLA python setup.py kurulumunu KULLANMAYIN! Sürümünüzü bozar! stackoverflow.com/questions/4324558/…
devinbost

2
@MikeS Geçici çözümün ne olduğunu tam olarak bilmiyorum, ancak size setup.py'yi çalıştırmanın beni saatlerce temizlik gerektiren kabus sorunlarına götürdüğünü söyleyebilirim. Ben pip veya conda ile bina / demetleme çözüm olacağını tahmin ediyorum.
devinbost

3
Sen bağlantısını değiştirebilecek docs.python.org/3/installing/index.html olmayan eski belgeler link, ve ayrıca bir bağlantı eklemek iyi olurdu packaging.python.org/tutorials/distributing- paketleri / # setup-py burada setup.pydosyanın amacını açıklar .
Alvaro Gutierrez Perez

492

fooMakinenize bir python paketi yüklemenize yardımcı olabilir (ayrıca olabilir virtualenv), böylece paketi foodiğer projelerden ve [I] Python istemlerinden içe aktarabilirsiniz .

Benzer işini yapar pip, easy_installvb.


kullanma setup.py

Bazı tanımlarla başlayalım:

Paket - __init__.pyDosya içeren bir klasör / dizin .
Modül - .pyUzantısı olan geçerli bir python dosyası .
Dağıtım - Bir paketin diğer paketler ve modüller ile ilişkisi .

Diyelim ki adlı bir paket yüklemek istiyorsunuz foo. Sonra yaparsın,

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

Bunun yerine, aslında yüklemek istemiyor ancak yine de kullanmak istiyorsanız. Sonra yapın,

$ python setup.py develop  

Bu komut, şeyleri kopyalamak yerine site paketleri içindeki kaynak dizine sembolik bağlantılar oluşturur. Bu nedenle, oldukça hızlıdır (özellikle büyük paketler için).


oluşturma setup.py

Paket ağacınız varsa,

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

Ardından, setup.pykomut dosyasında aşağıdakileri yaparsınız, böylece bazı makinelere yüklenebilir:

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
)

Bunun yerine, paket ağacınız aşağıdaki gibi daha karmaşıksa:

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

Sonra, setup.pybu durumda sizin gibi olurdu:

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) Klasörüne daha fazla öğe ekleyin ve düzgün yapın:

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_descriptionKullanılan pypi.org Paketinizin README açıklaması olarak.


Son olarak, paketinizi PyPi.org'a yüklemeye hazırsınız, böylece diğer kullanıcılar paketinizi kullanarakpip install yourpackage .

İlk adım, paket adınızı ve alanınızı pypi'de talep etmektir:

$ python setup.py register

Paket adınız kaydedildikten sonra kimse bunu talep edemez veya kullanamaz. Başarılı bir kayıttan sonra, paketinizi oraya (buluta) yüklemeniz gerekir,

$ python setup.py upload

İsteğe bağlı olarak, paketinizi şu yöntemle de imzalayabilirsiniz GPG:

$ python setup.py --sign upload

Bonus : setup.pyBurada gerçek bir projeden bir örnek görün :torchvision-setup.py


12
Kenneth Reitz (saygıdeğer yazarı requests-) açıkça setup.py dosyası iyi bir örnek vermek için bu projeyi sahiptir github.com/kennethreitz/setup.py
boweeb

Alt paketler, yani paketin içindeki modüllere sahip klasörler ne olacak?
fhchl

1
@ kmario23 Güzel açıklama, teşekkür ederim!
Dinko Pehar

1
Bu yanıtı seviyorum
SW_user2953243

1
@ SW_user2953243 Yararlı bulduğunuz için memnunum :)
kmario23

98

setup.py Python'un çok platformlu bir yükleyiciye cevabı ve make dosyaya .

Eğer komut satırı kurulumları aşina iseniz, o zaman make && make installçevirirpython setup.py build && python setup.py install .

Bazı paketler saf Python'dur ve sadece bayt derlenir. Diğerleri, yerel bir derleyici ( gccveya gibi cl) ve bir Python arabirim modülü ( swigveya gibi) gerektiren yerel kod içerebilir pyrex.


1
Yukarıdaki benzetmeye göre, modülün herhangi bir nedenle başarısız olması durumunda, setup.py komut dosyasıyla uğraşardım ... doğru mu?
MonaLisaOverdrive

1
Evet, bakabileceğiniz bazı yapılandırma dosyaları da olabilir.
whatnick

3
Eğer yanılıyorsam beni düzeltin ama ikisi arasında küçük bir fark olduğuna inanıyorum. python setup.py install aslında python setup.py buildilk önce çalışır (bu nedenle, belirli durumlarda ayrı olarak çalıştırmanız gerekmez). Her makezaman çalıştırmadan önce manuel olarak çalıştırılması gerektiğine inanıyorum make install.
joelostblom

6
@cheflo Aslında makeherhangi bir belirli parametre (veya sipariş) gerektirmez: Tamamen Makefilehangi "hedeflerin" (ve hangi sırayla çağrılmaları gerekir) mevcut olanın yaratıcısına bağlıdır . Çıplaklar Makefile(genellikle) çok taşınabilir olmadığından, ./configure(autotools) veya cmake .(cmake) gibi komutlar kullanılarak oluşturulma eğilimindedirler ve bu programlardan makeönce açıkça çalıştırılıp çalıştırılmayacağınızı belirlemek bu programlara bağlıdır make install.
ntninja

3
Hala docs.python.org/3/instal/index.html adresindeki dokümanlara göre setup.py'yi kullanmamız gerekip gerekmediğini söylemek için bir tanesine ihtiyacım var. " "
Kemin Zhou



19

setup.py iki senaryoda kullanılabilir: İlk olarak bir Python paketi kurmak istiyorsunuz. İkinci olarak, kendi Python paketinizi oluşturmak istiyorsunuz. Genellikle standart Python paketinde setup.py, setup.cfg ve Manifest.in gibi birkaç önemli dosya bulunur. Python paketini oluştururken, bu üç dosya (yumurta-bilgi klasörü altındaki PKG-INFO içeriği) adını, sürümünü, açıklamasını, diğer gerekli kurulumları (genellikle .txt dosyasında) ve diğer birkaç parametreyi belirler. setup.cfg, paket oluşturulurken setup.py tarafından okunur (tar.gz olabilir). Manifest.in, paketinize nelerin dahil edilmesi gerektiğini tanımlayabileceğiniz yerdir. Neyse setup.py kullanarak bir sürü şey yapabilirsiniz

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 ile kullanılabilecek başka komutlar da vardır. yardım için

python setup.py --help-commands

İçin teşekkürler python setup.py --help-commands. Setup.py dosyasına girerken çok kullanışlıdır.
Palec

8

setup.pyTerminalinizi (Mac, Linux) veya Komut İstemi'ni (Windows) açarak bir paket indirdiğinizde . cd Sekme düğmesini kullanarak ve size yardımcı olmak, dosyayı indirdiğiniz ve bulunduğu klasörün yolunu doğrudan ayarlayın setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Enter tuşuna basın, şöyle bir şey görmelisiniz:

iMac:pakagefolderwithsetupfile user$

Sonra buna yazın python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Düğmesine basın enter. Bitti!


7

İndirdiğiniz bir Python paketini yüklemek için arşivi çıkarır ve içindeki setup.py komut dosyasını çalıştırırsınız:

python setup.py install

Bana göre bu her zaman garip geldi. Bir paket yöneticisini Ruby ve Nodejs'de olduğu gibi, indirme sırasında bir paket yöneticisine yönlendirmek daha doğal olurdu.gem install rails-4.1.1.gem

Bir paket yöneticisi de daha rahat, çünkü tanıdık ve güvenilir. Öte yandan, her setup.pybiri yeni, çünkü pakete özgü. "Bu düzene güveniyorum. Geçmişte kullandığım diğer komutlarla aynı komutları alıyor" inancına inanıyor. Bu zihinsel irade için üzücü bir vergi.

Setup.py iş akışının bir paket yöneticisinden daha az güvenli olduğunu söylemiyorum (Pip'in sadece setup.py'yi çalıştırdığını anlıyorum), ancak kesinlikle awkard ve sarsıcı olduğunu hissediyorum. Tüm komutların aynı paket yöneticisi uygulamasına bağlı olması bir uyum sağlar. Hatta düşkün bile olabilirsiniz.


1
O zaman easy_install veya benzeri kullanabilirsiniz. Btw, Python'un yakut taşlarına benzeyen yumurtaları var.
Pavel Šimerda

7

setup.pydiğerleri gibi bir Python dosyasıdır. setup.pyHer komut dosyası için farklı bir yordam olmaması için adlandırılmış kural dışında herhangi bir ad alabilir .

En sık setup.py Python modülünü kurmak, ancak sunucuyu başka amaçlar için kullanmak için kullanılır:

Modüller:

Belki de bu setup.pymodüllerde en ünlü kullanımıdır . Bunlar kullanılarak yüklenebilmelerine rağmen pip, eski Python sürümleri pipvarsayılan olarak içermiyordu ve ayrı olarak yüklenmesi gerekiyordu.

Bir modül kurmak istiyor ancak kurmak istemiyorsanız pip, tek alternatif modülün setup.pydosyadan yüklenmesi idi . Bu ile elde edilebilir python setup.py install. Bu (olmadan kök sözlüğüne Python modülü yükleyecek pip, easy_installvb).

Bu yöntem genellikle pipbaşarısız olduğunda kullanılır . Örneğin, istenen paketin doğru Python sürümü pipbelki de artık korunmadığı için kullanılamıyorsa, python setup.py installderlenmiş ikili dosyaların olması durumu dışında , kaynağı indirip çalıştırmak aynı şeyi gerçekleştirir (ancak Python sürümü - bir hata döndürülmedikçe).

Bir başka kullanımı da setup.pykaynaktan paket kurmaktır. Bir modül hala geliştirilme aşamasındaysa, tekerlek dosyaları kullanılamayacak ve kurmanın tek yolu doğrudan kaynaktan kurmaktır.

Python uzantıları oluşturma:

Bir modül inşa edildiğinde, bir modül kullanılarak dağıtıma hazır modüle dönüştürülebilir. kurulum betiği . Oluşturulduktan sonra bunlar yukarıdaki komut kullanılarak kurulabilir.

Bir kurulum komut dosyasının oluşturulması kolaydır ve dosya düzgün bir şekilde yapılandırıldıktan sonra çalıştırılarak derlenebilir python setup.py build (tüm komutlar için bağlantıya bakın).

Bir kez daha adlandırıldı setup.py kullanım kolaylığı ve konvansiyon ile adlandırılmıştır, ancak herhangi bir isim alabilir.

Cython:

Bir başka ünlü setup.pydosya kullanımı derlenmiş uzantıları içerir. Bunlar, kullanıcı tanımlı değerlere sahip bir kurulum komut dosyası gerektirir. Hızlı (ancak derlendikten sonra platforma bağımlı) çalıştırmaya izin verirler. Belgelerden basit bir örnek :

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

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

Bu aracılığıyla derlenebilir python setup.py build

Cx_Freeze:

Kurulum betiği gerektiren başka bir modül cx_Freeze. Bu, Python komut dosyasını yürütülebilir dosyalara dönüştürür. Bu, açıklamalar, adlar, simgeler, paketler gibi birçok komutun dahil edilmesini, hariç tutulmasını sağlar ve çalıştırıldıktan sonra dağıtılabilir bir uygulama üretir. Belgelerden bir örnek :

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

Bu ile derlenebilir python setup.py build.

Peki setup.pydosya nedir?

Oldukça basit bir şekilde Python ortamında bir şey inşa eden veya yapılandıran bir betiktir.

Dağıtıldığında bir paket yalnızca bir kurulum komut dosyası içermelidir, ancak birkaç tanesini tek bir kurulum komut dosyasında birleştirmek nadir değildir. Bunun genellikle distutils(ancak son örneğimde gösterdiğim gibi) içerdiğine dikkat edin . Hatırlanması gereken şey Python paketini / komut dosyasını bir şekilde yapılandırır.

Bu komutu oluştururken veya kurarken her zaman aynı komutun kullanılabilmesi için adı alır.


6

Basitleştirmek için, setup.py, yükleme işlevlerini"__main__" çağırdığınızda belirtilen diğer yanıtları çalıştırır. Setup.py içinde, paketinizi kurmak için gereken her şeyi koymalısınız.

Genel setup.py işlevleri

Aşağıdaki iki bölümde, birçok setup.py modülünün sahip olduğu iki şey ele alınmıştır.

setuptools.setup

Bu işlev, projenin adı, sürümü gibi proje özniteliklerini belirtmenize olanak tanır. En önemlisi, bu işlev düzgün bir şekilde paketlenmişlerse diğer işlevleri yüklemenizi sağlar. Setuptools.setup örneği için bu web sayfasına bakın Bu setuptools.setup

öznitelikleri, bu tür paketlerin yüklenmesini sağlar:

  • Projenizin ithal ve listelenen paketler PyPI kullanarak setuptools.findpackages :

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

  • Paketler PyPI'de değil, bağımlılık_bağlantıları kullanılarak bir URL'den indirilebilir

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

Özel işlevler

İdeal bir dünyada setuptools.setupher şeyi halledebiliriz. Ne yazık ki bu her zaman böyle değildir. Bazen, yüklediğiniz sistemi paketiniz için doğru duruma getirmek için alt işlem komutuyla bağımlılıklar yüklemek gibi belirli şeyler yapmanız gerekir . Bundan kaçınmaya çalışın, bu işlevler kafa karıştırıcıdır ve genellikle işletim sistemi ve hatta dağıtım arasında farklılık gösterir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.