Apa itu setup.py?

992

Adakah yang bisa menjelaskan apa setup.pydan bagaimana itu dapat dikonfigurasi atau digunakan?

Antusiasme Perangkat Lunak
sumber
7
Eric: Contoh-contoh yang lebih baik menyatukan semuanya akan bermanfaat
Das.Rot
1
Bagi saya, selalu terasa aneh bagaimana menginstal paket yang Anda ekstrak dan menjalankan skrip di dalamnya, daripada menunjuk manajer paket pada apa yang telah Anda unduh. Itu akan lebih alami. stackoverflow.com/questions/1471994/what-is-setup-py/…
Kolonel Panic

Jawaban:

694

setup.py adalah file python, yang biasanya memberi tahu Anda bahwa modul / paket yang akan Anda instal telah dikemas dan didistribusikan dengan Distutils, yang merupakan standar untuk mendistribusikan Modul Python.

Ini memungkinkan Anda untuk dengan mudah menginstal paket Python. Cukup sering menulis:

$ pip install . 

pipakan menggunakan setup.py untuk menginstal modul Anda. Hindari menelepon setup.pysecara langsung.

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

Silfverstrom
sumber
9
Saya akan sangat menghargai jika Anda membagikan pengetahuan Anda tentang cara membuat atau menangani modul ini? Misalnya, cara membuat modul dasar, atau cara menguji skrip pada ./mymodule/bin yang mengimpor dari ./mymodule/libs/
Paulo Oliveira
7
@PauloOliveira Lihat Mendistribusikan Modul Python yang menjelaskan Distutils, secara khusus melihat ke dalam 2. Menulis Skrip Pengaturan .
Yous
4
JANGAN PERNAH GUNAKAN python setup.py install! Ini merusak versi Anda! stackoverflow.com/questions/4324558/…
devinbost
2
@ Mike Saya tidak tahu pasti apa solusinya, tetapi saya dapat memberitahu Anda bahwa menjalankan setup.py telah membawa saya ke masalah mimpi buruk yang membutuhkan pembersihan selama berjam-jam. Saya menduga bahwa bangunan / bundling dengan pip atau conda akan menjadi solusinya.
devinbost
3
Anda dapat mengubah tautan ke docs.python.org/3/installing/index.html , yang merupakan tautan dokumentasi non-lawas, dan juga sebaiknya menambahkan tautan ke packaging.python.org/tutorials/distributing- paket / # setup-py di mana ia menjelaskan tujuan dari setup.pyfile.
Alvaro Gutierrez Perez
494

Ini membantu untuk menginstal paket python foopada mesin Anda (bisa juga di virtualenv) sehingga Anda dapat mengimpor paket foodari proyek lain dan juga dari [I] Python meminta.

Ia melakukan pekerjaan serupa pip, easy_installdll.,


Menggunakan setup.py

Mari kita mulai dengan beberapa definisi:

Paket - Folder / direktori yang berisi __init__.pyfile.
Module - File python yang valid dengan .pyekstensi.
Distribusi - Bagaimana satu paket berhubungan dengan paket dan modul lainnya .

Katakanlah Anda ingin menginstal paket bernama foo. Lalu kamu lakukan,

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

Sebagai gantinya, jika Anda tidak ingin menginstalnya tetapi masih ingin menggunakannya. Lalu lakukan,

$ python setup.py develop  

Perintah ini akan membuat symlink ke direktori sumber di dalam paket situs alih-alih menyalin sesuatu. Karena itu, ini sangat cepat (terutama untuk paket besar).


Menciptakan setup.py

Jika Anda memiliki pohon paket seperti,

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

Kemudian, Anda melakukan hal berikut dalam setup.pyskrip Anda sehingga dapat diinstal pada beberapa mesin:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

Sebaliknya, jika pohon paket Anda lebih kompleks seperti di bawah ini:

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

Maka, Anda setup.pydalam hal ini akan seperti:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Tambahkan lebih banyak barang ke ( setup.py) & buat layak:

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='[email protected]',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Ini long_descriptiondigunakan di pypi.org sebagai deskripsi README dari paket Anda.


Dan akhirnya, Anda sekarang siap untuk mengunggah paket Anda ke PyPi.org sehingga orang lain dapat menginstal paket Anda menggunakan pip install yourpackage.

Langkah pertama adalah mengklaim nama paket Anda & ruang di pypi menggunakan:

$ python setup.py register

Setelah nama paket Anda terdaftar, tidak ada yang bisa mengklaim atau menggunakannya. Setelah pendaftaran berhasil, Anda harus mengunggah paket Anda ke sana (ke cloud) dengan,

$ python setup.py upload

Secara opsional, Anda juga dapat menandatangani paket Anda dengan GPG,

$ python setup.py --sign upload

Bonus : Lihat contoh setup.pydari proyek nyata di sini:torchvision-setup.py

kmario23
sumber
12
Kenneth Reitz (penulis yang terhormat requests) memiliki proyek ini untuk secara eksplisit memberikan contoh yang baik dari setup.py - github.com/kennethreitz/setup.py
boweeb
Bagaimana dengan sub-paket, yaitu folder dengan modul di dalam paket?
fhchl
1
@ kmario23 Penjelasan bagus, terima kasih!
Dinko Pehar
1
Saya suka jawaban ini
SW_user2953243
1
@ SW_user2953243 Saya senang Anda merasa bermanfaat :)
kmario23
98

setup.pyadalah jawaban Python untuk penginstal dan makefile multi-platform .

Jika Anda terbiasa dengan instalasi baris perintah, maka make && make installterjemahkan ke python setup.py build && python setup.py install.

Beberapa paket adalah Python murni, dan hanya byte yang dikompilasi. Orang lain mungkin berisi kode asli, yang akan memerlukan kompiler asli (suka gccatau cl) dan modul antarmuka Python (suka swigatau pyrex).

ada apa
sumber
1
Jadi menurut analogi di atas, jika membangun modul gagal karena beberapa alasan saya akan bermain-main dengan script setup.py ... benar?
MonaLisaOverdrive
1
Ya, mungkin juga ada beberapa file konfigurasi yang dapat Anda lihat.
whatnick
3
Perbaiki saya jika saya salah, tetapi saya percaya ada sedikit perbedaan di antara keduanya. python setup.py install sebenarnya berjalan python setup.py buildterlebih dahulu (jadi Anda tidak perlu menjalankannya secara terpisah kecuali dalam kasus tertentu). Saya percaya makeselalu harus dijalankan secara manual sebelum menjalankan make install.
joelostblom
6
@ cheflo Sebenarnya maketidak memerlukan parameter khusus (atau pemesanan): Ini sepenuhnya tergantung pada pembuat Makefile"target" yang tersedia (dan dalam urutan mana mereka perlu dipanggil). Karena bare Makefiles (biasanya) tidak terlalu portabel, mereka cenderung dihasilkan menggunakan perintah seperti ./configure(autotools) atau cmake .(cmake) dan karenanya hingga program-program ini untuk menentukan apakah Anda perlu menjalankan secara eksplisit makesebelum make installatau tidak.
ntninja
3
Saya memerlukan seseorang untuk memberi tahu saya apakah kita masih harus menggunakan setup.py lagi sesuai dengan dokumen di docs.python.org/3/installing/index.html "Sementara penggunaan langsung distutils sedang dihapus, ... "
Kemin Zhou
53

Jika Anda mengunduh paket yang memiliki "setup.py" di folder root, Anda dapat menginstalnya dengan menjalankan

python setup.py install

Jika Anda sedang mengembangkan proyek dan bertanya-tanya untuk apa file ini berguna, periksa dokumentasi Python tentang penulisan Skrip Pengaturan

Pēteris Caune
sumber
20

setup.pyadalah skrip Python yang biasanya dikirimkan bersama perpustakaan atau program, ditulis dalam bahasa itu. Tujuannya adalah pemasangan perangkat lunak yang benar.

Banyak paket menggunakan distutilsframework dalam hubungannya dengan setup.py.

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

Ferdinand Beyer
sumber
19

setup.py dapat digunakan dalam dua skenario, Pertama, Anda ingin menginstal paket Python. Kedua, Anda ingin membuat paket Python Anda sendiri. Biasanya paket standar Python memiliki beberapa file penting seperti setup.py, setup.cfg dan Manifest.in. Saat Anda membuat paket Python, ketiga file ini akan menentukan nama (versi di PKG-INFO di bawah folder info-telur), versi, deskripsi, instalasi lain yang diperlukan (biasanya dalam file .txt) dan beberapa parameter lainnya. setup.cfg dibaca oleh setup.py saat paket dibuat (bisa tar.gz). Manifest.in adalah di mana Anda dapat menentukan apa yang harus dimasukkan dalam paket Anda. Bagaimanapun Anda dapat melakukan banyak hal menggunakan setup.py suka

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

Ada banyak perintah lain yang dapat digunakan dengan setup.py. untuk bantuan

python setup.py --help-commands
Badak Avichal
sumber
Terima kasih untuk python setup.py --help-commands. Sangat berguna saat menggali ke dalam setup.py.
Palec
8

Saat Anda mengunduh paket dengan setup.pymembuka Terminal (Mac, Linux) atau Command Prompt (Windows). Menggunakan cd dan membantu Anda dengan tombol Tab mengatur jalur ke folder di mana Anda telah mengunduh file dan di mana ada setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Tekan enter, Anda akan melihat sesuatu seperti ini:

iMac:pakagefolderwithsetupfile user$

Kemudian ketik setelah ini python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Tekan enter. Selesai!

GM
sumber
7

Untuk menginstal paket Python yang telah Anda unduh, Anda mengekstrak arsip dan menjalankan skrip setup.py di dalam:

python setup.py install

Bagi saya, ini selalu terasa aneh. Akan lebih alami untuk menunjuk pengelola paket saat unduhan, seperti yang dilakukan di Ruby dan Nodejs, misalnya.gem install rails-4.1.1.gem

Pengelola paket juga lebih nyaman, karena akrab dan dapat diandalkan. Di sisi lain, masing setup.py- masing novel, karena khusus untuk paket. Ini menuntut kepercayaan pada konvensi "Saya percaya setup ini .py mengambil perintah yang sama seperti yang saya gunakan di masa lalu". Itu pajak yang disesalkan pada kemauan mental.

Saya tidak mengatakan alur kerja setup.py kurang aman daripada manajer paket (saya mengerti Pip hanya menjalankan setup.py di dalam), tapi tentu saja saya merasa itu canggung dan menggelegar. Ada keselarasan untuk perintah semua ke aplikasi manajer paket yang sama. Anda bahkan mungkin akan menyukainya.

Kolonel Panic
sumber
1
Kemudian Anda bisa menggunakan easy_install atau yang serupa. Btw, Python punya telur, agak mirip permata ruby.
Pavel Šimerda
7

setup.pyadalah file Python seperti yang lainnya. Itu dapat mengambil nama apa pun, kecuali dengan konvensi itu namanyasetup.py sehingga tidak ada prosedur yang berbeda dengan masing-masing skrip.

Paling sering setup.py digunakan untuk menginstal modul Python tetapi server tujuan lain:

Modul:

Mungkin ini adalah penggunaan yang paling terkenal setup.pydalam modul. Meskipun mereka dapat diinstal menggunakan pip, versi Python lama tidak termasuk pipsecara default dan mereka perlu diinstal secara terpisah.

Jika Anda ingin menginstal modul tetapi tidak ingin menginstal pip, satu-satunya alternatif adalah menginstal modul dari setup.pyfile. Ini dapat dicapai melalui python setup.py install. Ini akan menginstal modul Python ke kamus root (tanpa pip, easy_installdll).

Metode ini sering digunakan ketika pipakan gagal. Sebagai contoh jika versi Python yang benar dari paket yang diinginkan tidak tersedia melalui pipmungkin karena tidak lagi dipertahankan, mengunduh sumber dan menjalankanpython setup.py install akan melakukan hal yang sama, kecuali dalam kasus biner yang dikompilasi diperlukan, (tetapi akan mengabaikan Versi Python -kecuali kesalahan dikembalikan).

Penggunaan lain setup.pyadalah menginstal paket dari sumber. Jika modul masih dalam pengembangan, file roda tidak akan tersedia dan satu-satunya cara untuk menginstal adalah menginstal dari sumber secara langsung.

Membangun ekstensi Python:

Ketika modul telah dibangun, modul tersebut dapat dikonversi menjadi modul yang siap didistribusikan dengan menggunakan skrip pengaturan distutils . Setelah dibangun, ini dapat diinstal menggunakan perintah di atas.

Skrip pengaturan mudah dibuat dan setelah file dikonfigurasikan dengan benar dan dapat dikompilasi dengan menjalankan python setup.py build(lihat tautan untuk semua perintah).

Sekali lagi ini dinamai setup.pyuntuk kemudahan penggunaan dan dengan konvensi, tetapi dapat mengambil nama apa pun.

Cython:

Penggunaan setup.pyfile terkenal lainnya termasuk ekstensi yang dikompilasi. Ini membutuhkan skrip pengaturan dengan nilai yang ditentukan pengguna. Mereka memungkinkan eksekusi cepat (tetapi setelah dikompilasi bergantung pada platform). Berikut adalah contoh sederhana dari dokumentasi :

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

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

Ini dapat dikompilasi melalui python setup.py build

Cx_Freeze:

Modul lain yang membutuhkan skrip pengaturan adalah cx_Freeze. Ini mengubah skrip Python menjadi executable. Ini memungkinkan banyak perintah seperti deskripsi, nama, ikon, paket untuk dimasukkan, tidak termasuk dll dan sekali dijalankan akan menghasilkan aplikasi yang dapat didistribusikan. Contoh dari dokumentasi :

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

Ini dapat dikompilasi melalui python setup.py build.

Jadi apa itu setup.pyfile?

Sederhananya itu adalah skrip yang membangun atau mengkonfigurasi sesuatu di lingkungan Python.

Sebuah paket ketika didistribusikan harus mengandung hanya satu skrip pengaturan tetapi tidak jarang untuk menggabungkan beberapa skrip pengaturan menjadi satu. Perhatikan ini sering melibatkan distutilstetapi tidak selalu (seperti yang saya tunjukkan dalam contoh terakhir saya). Yang perlu diingat itu hanya mengkonfigurasi paket / skrip Python dalam beberapa cara.

Dibutuhkan nama sehingga perintah yang sama selalu dapat digunakan saat membangun atau menginstal.

Simon
sumber
6

Untuk membuatnya sederhana, setup.py dijalankan seperti "__main__"ketika Anda memanggil fungsi instal jawaban lain yang disebutkan. Di dalam setup.py, Anda harus meletakkan semua yang diperlukan untuk menginstal paket Anda.

Fungsi setup.py umum

Dua bagian berikut membahas dua hal yang dimiliki banyak modul setup.py.

setuptools.setup

Fungsi ini memungkinkan Anda untuk menentukan atribut proyek seperti nama proyek, versi .... Yang paling penting, fungsi ini memungkinkan Anda untuk menginstal fungsi lain jika mereka dikemas dengan benar. Lihat halaman web ini untuk contoh setuptools.setup

Atribut setuptools.setup ini memungkinkan menginstal jenis paket ini:

  • Paket yang diimpor ke proyek Anda dan terdaftar di PyPI menggunakan setuptools.findpackages :

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

  • Paket tidak dalam PyPI , tetapi dapat diunduh dari URL menggunakan dependency_links

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

Fungsi kustom

Di dunia yang ideal, setuptools.setupakan menangani segalanya untuk Anda. Sayangnya ini tidak selalu terjadi. Kadang-kadang Anda harus melakukan hal-hal tertentu, seperti menginstal dependensi dengan perintah subproses , untuk mendapatkan sistem yang Anda instal dalam keadaan yang tepat untuk paket Anda. Cobalah untuk menghindari ini, fungsi-fungsi ini menjadi membingungkan dan seringkali berbeda antara OS dan pemerataan .

mikeLundquist
sumber