setup.py คืออะไร


990

ใครช่วยกรุณาอธิบายว่าsetup.pyมันคืออะไรและมันสามารถถูกกำหนดค่าหรือใช้?


7
Eric: ตัวอย่างที่ดีกว่าการรวมทุกอย่างเข้าด้วยกันจะเป็นประโยชน์
Das.Rot

1
สำหรับฉันแล้วมันรู้สึกแปลก ๆ เสมอว่าจะติดตั้งแพคเกจที่คุณแตกแล้วและรันสคริปต์ข้างในแทนที่จะชี้ไปที่ตัวจัดการแพ็คเกจในสิ่งที่คุณดาวน์โหลดมา นั่นจะเป็นธรรมชาติมากขึ้น stackoverflow.com/questions/1471994/what-is-setup-py/…
Colonel Panic

คำตอบ:


694

setup.py เป็นไฟล์ไพ ธ อนซึ่งมักจะบอกคุณว่าโมดูล / แพ็คเกจที่คุณกำลังจะติดตั้งได้รับการทำแพ็กเกจและแจกจ่ายด้วย 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/
Paulo Oliveira

7
@PauloOliveira ดูการกระจายโมดูลหลามซึ่งอธิบาย distutils เฉพาะมองเข้าไป2. การเขียนสคริปต์การติดตั้ง
Yous

4
ไม่เคยติดตั้ง python setup.py ติดตั้งเลย! มันทำลายการกำหนดเวอร์ชันของคุณ! stackoverflow.com/questions/4324558/…
devinbost

2
@ ไมค์ฉันไม่รู้ว่าวิธีแก้ปัญหาคืออะไร แต่ฉันสามารถบอกคุณได้ว่าการใช้ setup.py ทำให้ฉันต้องเจอกับฝันร้ายที่ต้องใช้เวลาทำความสะอาดหลายชั่วโมง ฉันเดาว่าการสร้าง / มัดด้วย pip หรือ conda จะเป็นทางออก
devinbost

3
คุณสามารถเปลี่ยนลิงค์ไปที่docs.python.org/3/installing/index.htmlซึ่งเป็นลิงค์เอกสารที่ไม่ใช่แบบดั้งเดิมและจะเป็นการดีถ้าคุณเพิ่มลิงค์ไปยังpackaging.python.org/tutorials/distributing- packages / # setup-pyโดยที่มันยังคงวัตถุประสงค์ของsetup.pyไฟล์
Alvaro Gutierrez Perez

492

ช่วยในการติดตั้งแพ็กเกจหลามfooบนเครื่องของคุณ (สามารถอยู่ในvirtualenv) เพื่อให้คุณสามารถนำเข้าแพคเกจfooจากโครงการอื่น ๆ และจาก [I] แจ้งให้หลาม

มันไม่งานของที่คล้ายกันpip, easy_installฯลฯ


การใช้ setup.py

เริ่มด้วยคำจำกัดความบางอย่าง:

แพ็คเกจ - โฟลเดอร์ / ไดเรกทอรีที่มี__init__.pyไฟล์
Module - ไฟล์ python ที่ถูกต้องพร้อม.pyส่วนขยาย
การแจกจ่าย - แพคเกจหนึ่งเกี่ยวข้องกับแพ็คเกจและโมดูลอื่นอย่างไรอื่นอย่างไร

fooสมมติว่าคุณต้องการติดตั้งแพคเกจที่มีชื่อว่า จากนั้นคุณทำ

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

แต่ถ้าคุณไม่ต้องการติดตั้งจริง แต่ก็ยังต้องการใช้งาน จากนั้นทำ

$ python setup.py develop  

คำสั่งนี้จะสร้าง symlink ไปยังไดเรกทอรีต้นทางภายในไซต์แพ็คเกจแทนที่จะคัดลอกสิ่งต่าง ๆ ด้วยเหตุนี้มันค่อนข้างเร็ว (โดยเฉพาะสำหรับแพ็คเกจขนาดใหญ่)


การสร้าง 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.orgpip install yourpackageเพื่อให้ผู้อื่นสามารถติดตั้งแพคเกจของคุณโดยใช้

ขั้นตอนแรกคืออ้างสิทธิ์ชื่อแพ็คเกจ & พื้นที่ใน pypi โดยใช้:

$ python setup.py register

เมื่อลงทะเบียนชื่อแพ็คเกจของคุณแล้วจะไม่มีใครสามารถเรียกร้องหรือใช้มันได้ หลังจากลงทะเบียนเรียบร้อยแล้วคุณต้องอัปโหลดแพ็คเกจของคุณที่นั่น (ไปยังคลาวด์) โดย

$ python setup.py upload

คุณยังสามารถลงนามในแพ็คเกจของคุณด้วยGPGโดย

$ python setup.py --sign upload

โบนัส : ดูตัวอย่างsetup.pyจากโครงการจริงที่นี่:torchvision-setup.py


12
Kenneth Reitz (ผู้เขียนที่เคารพrequests) มีโครงการนี้เพื่อให้ตัวอย่างที่ดีของ setup.py - github.com/kennethreitz/setup.py
boweeb

สิ่งที่เกี่ยวกับแพ็คเกจย่อยเช่นโฟลเดอร์ที่มีโมดูลภายในแพ็คเกจ
fhchl

1
@ kmario23 คำอธิบายดีขอบคุณ!
Dinko Pehar

1
ฉันชอบคำตอบนี้
SW_user2953243

1
@ SW_user2953243 ฉันดีใจที่คุณพบว่ามีประโยชน์ :)
kmario23

98

setup.pyคือคำตอบของ Python สำหรับโปรแกรมติดตั้งและmakeไฟล์แบบหลายแพลตฟอร์ม

หากคุณคุ้นเคยกับการติดตั้งบรรทัดคำสั่งแล้วแปลว่าmake && make installpython 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

53

หากคุณดาวน์โหลดแพคเกจที่มี "setup.py" ในโฟลเดอร์รูทคุณสามารถติดตั้งได้โดยเรียกใช้

python setup.py install

หากคุณกำลังพัฒนาโครงการและกำลังสงสัยว่าไฟล์นี้มีประโยชน์อะไรให้ตรวจสอบเอกสาร Python เกี่ยวกับการเขียนสคริปต์การตั้งค่า


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 ภายใต้โฟลเดอร์ egg-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
Palec

8

เมื่อคุณดาวน์โหลดแพ็คเกจโดยsetup.pyเปิด Terminal (Mac, Linux) หรือ Command Prompt (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 มีความปลอดภัยน้อยกว่าตัวจัดการแพคเกจ (ฉันเข้าใจ Pip เพียงแค่เรียกใช้ setup.py ภายใน) แต่แน่นอนฉันรู้สึกว่ามันอึดอัดและสั่นสะเทือน มีความสามัคคีกับคำสั่งทั้งหมดเป็นไปยังโปรแกรมจัดการแพคเกจเดียวกัน คุณอาจจะชอบมันมากขึ้น


1
จากนั้นคุณสามารถใช้ easy_install หรือคล้ายกันได้ Btw, Python มีไข่คล้ายกับพลอยทับทิม
Pavel Šimerda

7

setup.pyเป็นไฟล์ Python เหมือนอย่างอื่น มันสามารถใช้ชื่อใด ๆ ยกเว้นโดยการประชุมมันเป็นชื่อsetup.pyเพื่อให้ไม่มีขั้นตอนที่แตกต่างกันสำหรับแต่ละสคริปต์

บ่อยที่สุด setup.pyจะใช้เพื่อติดตั้งโมดูล Python แต่ใช้เพื่อวัตถุประสงค์อื่นของเซิร์ฟเวอร์:

โมดูล

บางทีนี่เป็นการใช้ที่มีชื่อเสียงที่สุดของsetup.pyอยู่ในโมดูล แม้ว่าจะสามารถติดตั้งได้โดยใช้pipเวอร์ชัน Python รุ่นเก่าจะไม่รวมอยู่ในpipค่าเริ่มต้นและจำเป็นต้องติดตั้งแยกต่างหาก

หากคุณต้องการติดตั้งโมดูล แต่ไม่ต้องการติดตั้งpipเพียงทางเลือกเดียวคือติดตั้งโมดูลจากsetup.pyไฟล์ python setup.py installนี้จะประสบความสำเร็จผ่านทาง นี้จะติดตั้งโมดูลหลามในพจนานุกรมราก (โดยไม่ต้องpip, easy_installect)

วิธีนี้มักจะใช้เมื่อpipจะล้มเหลว ตัวอย่างเช่นถ้าเวอร์ชัน Python ที่ถูกต้องของแพ็กเกจที่ต้องการไม่สามารถใช้งานได้pipเนื่องจากอาจไม่ได้รับการดูแลรักษาอีกต่อไปการดาวน์โหลดแหล่งที่มาและการรันpython setup.py installจะทำงานในลักษณะเดียวกันยกเว้นในกรณีที่จำเป็นต้องมีไบนารีที่รวบรวมไว้ Python เวอร์ชั่น - หากไม่มีข้อผิดพลาดจะถูกส่งคืน)

การใช้งานอื่นsetup.pyคือการติดตั้งแพ็คเกจจากแหล่งที่มา หากโมดูลยังอยู่ระหว่างการพัฒนาไฟล์ล้อจะไม่สามารถใช้ได้และวิธีเดียวที่จะติดตั้งคือการติดตั้งจากแหล่งโดยตรง

การสร้างส่วนขยาย Python:

เมื่อโมดูลได้รับการสร้างมันสามารถแปลงเป็นโมดูลพร้อมสำหรับการกระจายการใช้สคริปต์การติดตั้ง distutils เมื่อสร้างแล้วสามารถติดตั้งได้โดยใช้คำสั่งด้านบน

สคริปต์การตั้งค่านั้นง่ายต่อการสร้างและเมื่อไฟล์ได้รับการกำหนดค่าอย่างเหมาะสมและสามารถรวบรวมได้โดยการเรียกใช้python setup.py build(ดูลิงก์สำหรับคำสั่งทั้งหมด)

อีกครั้งที่มันถูกตั้งชื่อsetup.pyเพื่อความสะดวกในการใช้งานและตามแบบแผน แต่สามารถใช้ชื่อใด ๆ

Cython:

การใช้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แต่ไม่เสมอไป (อย่างที่ฉันแสดงในตัวอย่างสุดท้าย) สิ่งที่ต้องจำไว้ก็แค่กำหนดค่าแพ็คเกจ / สคริปต์ในบางวิธี

ใช้ชื่อเพื่อให้สามารถใช้คำสั่งเดียวกันเมื่อสร้างหรือติดตั้ง


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

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

ฟังก์ชั่นที่กำหนดเอง

ในโลกอุดมคติsetuptools.setupจะจัดการทุกอย่างให้คุณ น่าเสียดายที่นี่ไม่ได้เป็นเช่นนั้นเสมอไป บางครั้งคุณต้องทำสิ่งที่เฉพาะเจาะจงเช่นการติดตั้งการพึ่งพากับคำสั่งsubprocessเพื่อให้ระบบคุณติดตั้งในสถานะที่เหมาะสมสำหรับแพ็คเกจของคุณ พยายามที่จะหลีกเลี่ยงปัญหานี้ฟังก์ชั่นเหล่านี้ได้รับความสับสนและมักจะแตกต่างกันระหว่างระบบปฏิบัติการและแม้กระทั่งการจัดจำหน่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.