ใครช่วยกรุณาอธิบายว่า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 install
python 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
ที่ "เป้าหมาย" ที่มีอยู่อย่างสมบูรณ์ (และลำดับที่พวกเขาต้องการที่จะเรียก) เนื่องจากMakefile
s เปล่า(มักจะ) ไม่พกพามากพวกเขามักจะถูกสร้างโดยใช้คำสั่งเช่น./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-commands
python 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 install
enter
กด ทำ!
ในการติดตั้งแพ็กเกจ 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_install
ect)
วิธีนี้มักจะใช้เมื่อ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เพื่อให้ระบบคุณติดตั้งในสถานะที่เหมาะสมสำหรับแพ็คเกจของคุณ พยายามที่จะหลีกเลี่ยงปัญหานี้ฟังก์ชั่นเหล่านี้ได้รับความสับสนและมักจะแตกต่างกันระหว่างระบบปฏิบัติการและแม้กระทั่งการจัดจำหน่าย