ใครช่วยกรุณาอธิบายว่าsetup.pyมันคืออะไรและมันสามารถถูกกำหนดค่าหรือใช้?
ใครช่วยกรุณาอธิบายว่าsetup.pyมันคืออะไรและมันสามารถถูกกำหนดค่าหรือใช้?
คำตอบ:
setup.py เป็นไฟล์ไพ ธ อนซึ่งมักจะบอกคุณว่าโมดูล / แพ็คเกจที่คุณกำลังจะติดตั้งได้รับการทำแพ็กเกจและแจกจ่ายด้วย Distutils ซึ่งเป็นมาตรฐานสำหรับการแจกจ่ายโมดูล Python
สิ่งนี้ช่วยให้คุณติดตั้งแพ็คเกจ Python ได้อย่างง่ายดาย บ่อยครั้งที่มันเพียงพอที่จะเขียน:
$ pip install . pipจะใช้ setup.py เพื่อติดตั้งโมดูลของคุณ หลีกเลี่ยงการโทรsetup.pyโดยตรง
https://docs.python.org/3/installing/index.html#installing-index
setup.pyไฟล์
                    ช่วยในการติดตั้งแพ็กเกจหลาม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
requests) มีโครงการนี้เพื่อให้ตัวอย่างที่ดีของ setup.py - github.com/kennethreitz/setup.py
                    setup.pyคือคำตอบของ Python สำหรับโปรแกรมติดตั้งและmakeไฟล์แบบหลายแพลตฟอร์ม
หากคุณคุ้นเคยกับการติดตั้งบรรทัดคำสั่งแล้วแปลว่าmake && make installpython setup.py build && python setup.py install
แพคเกจบางอย่างเป็น Python แท้และรวบรวมเป็นแบบไบต์เท่านั้น อื่น ๆ อาจมีรหัสเนทีฟซึ่งจะต้องมีคอมไพเลอร์เนทีฟ (เช่นgccหรือcl) และโมดูลการเชื่อมต่อ Python (เช่นswigหรือpyrex)
python setup.py install ทำงานจริงpython setup.py buildก่อน (ดังนั้นคุณไม่จำเป็นต้องเรียกใช้แยกต่างหากยกเว้นในบางกรณี) ผมเชื่อเสมอจะต้องมีการทำงานด้วยตนเองก่อนที่จะเรียกmake make install
                    makeไม่จำเป็นต้องมีพารามิเตอร์เฉพาะ (หรือการสั่งซื้อ): มันขึ้นอยู่กับผู้สร้างMakefileที่ "เป้าหมาย" ที่มีอยู่อย่างสมบูรณ์ (และลำดับที่พวกเขาต้องการที่จะเรียก) เนื่องจากMakefiles เปล่า(มักจะ) ไม่พกพามากพวกเขามักจะถูกสร้างโดยใช้คำสั่งเช่น./configure(autotools) หรือcmake .(cmake) และมันขึ้นอยู่กับโปรแกรมเหล่านี้เพื่อกำหนดว่าคุณต้องรันmakeก่อนmake installหรือไม่
                    หากคุณดาวน์โหลดแพคเกจที่มี "setup.py" ในโฟลเดอร์รูทคุณสามารถติดตั้งได้โดยเรียกใช้
python setup.py installหากคุณกำลังพัฒนาโครงการและกำลังสงสัยว่าไฟล์นี้มีประโยชน์อะไรให้ตรวจสอบเอกสาร Python เกี่ยวกับการเขียนสคริปต์การตั้งค่า
setup.pyเป็นสคริปต์ Python ที่โดยปกติแล้วจะมีไลบรารีหรือโปรแกรมที่เขียนด้วยภาษานั้น มันมีจุดประสงค์คือการติดตั้งซอฟต์แวร์ที่ถูกต้อง
แพ็คเกจจำนวนมากใช้distutilsเฟรมเวิร์กร่วมกับsetup.pyกรอบการร่วมกับ
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-commandspython setup.py --help-commandsขอบคุณสำหรับ มีประโยชน์มากเมื่อขุดเข้าไปใน setup.py
                    เมื่อคุณดาวน์โหลดแพ็คเกจโดย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 installenterกด ทำ!
ในการติดตั้งแพ็กเกจ 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 ภายใน) แต่แน่นอนฉันรู้สึกว่ามันอึดอัดและสั่นสะเทือน มีความสามัคคีกับคำสั่งทั้งหมดเป็นไปยังโปรแกรมจัดการแพคเกจเดียวกัน คุณอาจจะชอบมันมากขึ้น
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แต่ไม่เสมอไป (อย่างที่ฉันแสดงในตัวอย่างสุดท้าย) สิ่งที่ต้องจำไว้ก็แค่กำหนดค่าแพ็คเกจ / สคริปต์ในบางวิธี
ใช้ชื่อเพื่อให้สามารถใช้คำสั่งเดียวกันเมื่อสร้างหรือติดตั้ง
เพื่อให้ง่ายขึ้น setup.py จะทำงานเหมือน"__main__"เมื่อคุณเรียกใช้ฟังก์ชันการติดตั้งตามคำตอบอื่น ๆ ที่กล่าวถึง ภายใน setup.py คุณควรใส่ทุกสิ่งที่จำเป็นในการติดตั้งแพ็คเกจของคุณ
สองส่วนต่อไปนี้กล่าวถึงสองสิ่งที่มีโมดูล setup.py หลายตัว
ฟังก์ชั่นนี้ช่วยให้คุณสามารถระบุคุณสมบัติของโครงการเช่นชื่อของโครงการเวอร์ชัน ... ที่สำคัญที่สุดคือฟังก์ชั่นนี้ช่วยให้คุณติดตั้งฟังก์ชั่นอื่น ๆ ได้หากบรรจุไว้อย่างถูกต้อง ดูหน้าเว็บนี้สำหรับตัวอย่างของ 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เพื่อให้ระบบคุณติดตั้งในสถานะที่เหมาะสมสำหรับแพ็คเกจของคุณ พยายามที่จะหลีกเลี่ยงปัญหานี้ฟังก์ชั่นเหล่านี้ได้รับความสับสนและมักจะแตกต่างกันระหว่างระบบปฏิบัติการและแม้กระทั่งการจัดจำหน่าย