Bất cứ ai có thể giải thích những gì setup.py
và làm thế nào nó có thể được cấu hình hoặc sử dụng?
Bất cứ ai có thể giải thích những gì setup.py
và làm thế nào nó có thể được cấu hình hoặc sử dụng?
Câu trả lời:
setup.py
là một tệp python, thường cho bạn biết rằng mô-đun / gói bạn sắp cài đặt đã được đóng gói và phân phối với Distutils, đây là tiêu chuẩn để phân phối Mô-đun Python.
Điều này cho phép bạn dễ dàng cài đặt các gói Python. Thường thì nó đủ để viết:
$ pip install .
pip
sẽ sử dụng setup.py để cài đặt mô-đun của bạn. Tránh gọi setup.py
trực tiếp.
https://docs.python.org/3/installing/index.html#installing-index
setup.py
tệp.
Nó giúp cài đặt gói python foo
trên máy của bạn (cũng có thể ở trong virtualenv
) để bạn có thể nhập gói foo
từ các dự án khác và từ [I] nhắc nhở Python.
Nó làm công việc tương tự pip
, easy_install
v.v.
Sử dụng setup.py
Hãy bắt đầu với một số định nghĩa:
Gói - Một thư mục / thư mục có chứa __init__.py
tệp.
Mô-đun - Một tệp python hợp lệ có .py
phần mở rộng.
Phân phối - Làm thế nào một gói liên quan đến các gói và mô-đun khác .
Giả sử bạn muốn cài đặt một gói có tên foo
. Sau đó, bạn làm
$ git clone https://github.com/user/foo
$ cd foo
$ python setup.py install
Thay vào đó, nếu bạn không thực sự muốn cài đặt nó nhưng vẫn muốn sử dụng nó. Sau đó làm
$ python setup.py develop
Lệnh này sẽ tạo liên kết tượng trưng đến thư mục nguồn trong các gói trang web thay vì sao chép mọi thứ. Bởi vì điều này, nó khá nhanh (đặc biệt đối với các gói lớn).
Tạo setup.py
Nếu bạn có cây gói của bạn như thế nào,
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
└── setup.py
Sau đó, bạn thực hiện các thao tác sau trong setup.py
tập lệnh của mình để có thể cài đặt nó trên một số máy:
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
)
Thay vào đó, nếu cây gói của bạn phức tạp hơn như cây dưới đây:
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
├── scripts
│ ├── cool
│ └── skype
└── setup.py
Sau đó, setup.py
trong trường hợp của bạn sẽ như sau:
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',
]
)
Thêm nhiều thứ vào ( setup.py
) và làm cho nó đàng hoàng:
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',
]
)
Nó long_description
được sử dụng trong pypi.org như mô tả README của gói của bạn.
Và cuối cùng, giờ bạn đã sẵn sàng để tải gói của bạn lên PyPi.org để những người khác có thể cài đặt gói của bạn bằng cách sử dụng pip install yourpackage
.
Bước đầu tiên là yêu cầu tên & không gian gói của bạn bằng pypi bằng cách sử dụng:
$ python setup.py register
Khi tên gói của bạn được đăng ký, không ai có thể yêu cầu hoặc sử dụng nó. Sau khi đăng ký thành công, bạn phải tải gói của mình lên đó (lên đám mây) bằng cách,
$ python setup.py upload
Tùy chọn, bạn cũng có thể ký gói của bạn với GPG
,
$ python setup.py --sign upload
Phần thưởng : Xem mẫu setup.py
từ một dự án thực tế tại đây:torchvision-setup.py
requests
) có dự án này để đưa ra một ví dụ rõ ràng về setup.py - github.com/kennethreitz/setup.py
setup.py
là câu trả lời của Python cho trình cài đặt và make
tệp đa nền tảng .
Nếu bạn quen thuộc với việc cài đặt dòng lệnh, thì hãy make && make install
dịch sang python setup.py build && python setup.py install
.
Một số gói là Python thuần túy và chỉ được biên dịch byte. Những người khác có thể chứa mã gốc, sẽ yêu cầu trình biên dịch gốc (như gcc
hoặc cl
) và mô-đun giao tiếp Python (như swig
hoặc pyrex
).
python setup.py install
thực sự chạy python setup.py build
trước (vì vậy bạn không cần chạy riêng trừ khi trong trường hợp cụ thể). Tôi tin rằng make
luôn cần phải được chạy thủ công trước khi chạy make install
.
make
không yêu cầu bất kỳ tham số cụ thể nào (hoặc đặt hàng): Điều đó hoàn toàn phụ thuộc vào người tạo ra Makefile
"mục tiêu" có sẵn (và theo thứ tự chúng cần được gọi). Vì các thiết bị trần Makefile
(thường) không dễ mang theo, nên chúng có xu hướng được tạo bằng các lệnh như ./configure
(autotools) hoặc cmake .
(cmake) và theo đó các chương trình này sẽ xác định xem bạn có cần chạy rõ ràng make
trước make install
hay không.
Nếu bạn đã tải xuống gói có "setup.py" trong thư mục gốc, bạn có thể cài đặt gói đó bằng cách chạy
python setup.py install
Nếu bạn đang phát triển một dự án và đang tự hỏi tập tin này hữu ích cho việc gì, hãy kiểm tra tài liệu Python về cách viết Script thiết lập
setup.py
là một tập lệnh Python thường được gửi cùng với các thư viện hoặc chương trình, được viết bằng ngôn ngữ đó. Mục đích của nó là cài đặt chính xác phần mềm.
Nhiều gói sử dụng distutils
khung kết hợp với setup.py
.
setup.py có thể được sử dụng trong hai kịch bản, Đầu tiên, bạn muốn cài đặt gói Python. Thứ hai, bạn muốn tạo gói Python của riêng bạn. Thông thường gói Python tiêu chuẩn có một vài tệp quan trọng như setup.py, setup.cfg và Manifest.in. Khi bạn đang tạo gói Python, ba tệp này sẽ xác định (nội dung trong PKG-INFO trong thư mục thông tin trứng), phiên bản, mô tả, các cài đặt cần thiết khác (thường là trong tệp .txt) và một vài tham số khác. setup.cfg được đọc bởi setup.py trong khi gói được tạo (có thể là tar.gz). Manifest.in là nơi bạn có thể xác định những gì nên được bao gồm trong gói của bạn. Dù sao, bạn có thể thực hiện một loạt các công cụ bằng cách sử dụng setup.py như
python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo] (to upload package to pypi or local repo)
Có một loạt các lệnh khác có thể được sử dụng với setup.py. để được giúp đỡ
python setup.py --help-commands
python setup.py --help-commands
. Rất hữu ích khi đào sâu vào setup.py.
Khi bạn tải xuống một gói với setup.py
mở Terminal (Mac, Linux) hoặc Command Prompt (Windows). Sử dụng cd
và giúp bạn với nút Tab, đặt đường dẫn ngay tới thư mục mà bạn đã tải xuống tệp và nơi có setup.py
:
iMac:~ user $ cd path/pakagefolderwithsetupfile/
Nhấn enter, bạn sẽ thấy một cái gì đó như thế này:
iMac:pakagefolderwithsetupfile user$
Sau đó gõ sau python setup.py install
:
iMac:pakagefolderwithsetupfile user$ python setup.py install
Nhấn enter
. Làm xong!
Để cài đặt gói Python bạn đã tải xuống, bạn giải nén tệp lưu trữ và chạy tập lệnh setup.py bên trong:
python setup.py install
Đối với tôi, điều này luôn luôn cảm thấy kỳ lạ. Sẽ là tự nhiên hơn khi chỉ ra một trình quản lý gói khi tải xuống, như người ta sẽ làm trong Ruby và Nodejs, vd.gem install rails-4.1.1.gem
Một người quản lý gói cũng thoải mái hơn, bởi vì nó quen thuộc và đáng tin cậy. Mặt khác, mỗi setup.py
cuốn đều là tiểu thuyết, bởi vì nó đặc trưng cho gói. Nó đòi hỏi niềm tin vào quy ước "Tôi tin rằng thiết lập này có các lệnh giống như các lệnh khác mà tôi đã sử dụng trong quá khứ". Đó là một loại thuế đáng tiếc đối với sức mạnh ý chí.
Tôi không nói rằng quy trình làm việc của setup.txt kém an toàn hơn so với trình quản lý gói (tôi hiểu Pip chỉ chạy setup.py bên trong), nhưng chắc chắn tôi cảm thấy nó thật tồi tệ và chói tai. Có một sự hài hòa để ra lệnh cho tất cả các ứng dụng quản lý gói giống nhau. Bạn thậm chí có thể phát triển thích nó.
setup.py
là một tệp Python giống như bất kỳ tệp nào khác. Nó có thể lấy bất kỳ tên nào, ngoại trừ theo quy ước, nó được đặt tên setup.py
sao cho không có một quy trình khác nhau với mỗi tập lệnh.
Thường xuyên nhất setup.py
được sử dụng để cài đặt một mô-đun Python nhưng máy chủ cho các mục đích khác:
Mô-đun:
Có lẽ đây là cách sử dụng nổi tiếng nhất setup.py
là trong các mô-đun. Mặc dù chúng có thể được cài đặt bằng cách sử dụng pip
, các phiên bản Python cũ không bao gồm pip
theo mặc định và chúng cần được cài đặt riêng.
Nếu bạn muốn cài đặt một mô-đun nhưng không muốn cài đặt pip
, chỉ có một cách thay thế duy nhất là cài đặt mô-đun từ setup.py
tệp. Điều này có thể đạt được thông qua python setup.py install
. Điều này sẽ cài đặt mô-đun Python vào từ điển gốc (không có pip
, easy_install
ect).
Phương pháp này thường được sử dụng khi pip
sẽ thất bại. Ví dụ: nếu phiên bản Python chính xác của gói mong muốn không có sẵn thông qua pip
có lẽ vì nó không còn được duy trì, thì việc tải xuống nguồn và chạy python setup.py install
sẽ thực hiện điều tương tự, ngoại trừ trong trường hợp nhị phân được biên dịch là bắt buộc, (nhưng sẽ bỏ qua Phiên bản Python - không có lỗi được trả về).
Một cách sử dụng khác setup.py
là cài đặt một gói từ nguồn. Nếu một mô-đun vẫn đang được phát triển, các tệp bánh xe sẽ không có sẵn và cách duy nhất để cài đặt là cài đặt trực tiếp từ nguồn.
Xây dựng tiện ích mở rộng Python:
Khi một mô-đun đã được xây dựng, nó có thể được chuyển đổi thành mô-đun sẵn sàng để phân phối bằng cách sử dụng tập lệnh thiết lập distutils . Sau khi xây dựng chúng có thể được cài đặt bằng cách sử dụng lệnh trên.
Một tập lệnh thiết lập rất dễ xây dựng và một khi tập tin đã được cấu hình đúng và có thể được biên dịch bằng cách chạy python setup.py build
(xem liên kết cho tất cả các lệnh).
Một lần nữa, nó được đặt tên setup.py
để dễ sử dụng và theo quy ước, nhưng có thể lấy bất kỳ tên nào.
Con trăn:
Một cách sử dụng setup.py
tập tin nổi tiếng khác bao gồm các phần mở rộng được biên dịch. Chúng yêu cầu một tập lệnh thiết lập với các giá trị do người dùng xác định. Chúng cho phép thực thi nhanh (nhưng một khi được biên dịch là phụ thuộc vào nền tảng). Đây là một ví dụ đơn giản từ tài liệu :
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_modules = cythonize("hello.pyx"),
)
Điều này có thể được biên dịch thông qua python setup.py build
Cx_Freeze:
Một mô-đun khác yêu cầu một kịch bản thiết lập là cx_Freeze
. Điều này chuyển đổi tập lệnh Python thành tập tin thực thi. Điều này cho phép nhiều lệnh như mô tả, tên, biểu tượng, gói để bao gồm, loại trừ ect và một khi chạy sẽ tạo ra một ứng dụng phân phối. Một ví dụ từ tài liệu :
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)])
Điều này có thể được biên dịch thông qua python setup.py build
.
Vậy một setup.py
tập tin là gì?
Rất đơn giản, nó là một tập lệnh xây dựng hoặc cấu hình một cái gì đó trong môi trường Python.
Một gói khi được phân phối chỉ chứa một tập lệnh thiết lập nhưng không có gì lạ khi kết hợp nhiều tập hợp lại với nhau thành một tập lệnh thiết lập. Lưu ý điều này thường liên quan distutils
nhưng không phải luôn luôn (như tôi đã chỉ ra trong ví dụ cuối cùng của tôi). Điều cần nhớ là chỉ cấu hình gói / tập lệnh Python theo một cách nào đó.
Nó có tên để cùng một lệnh luôn có thể được sử dụng khi xây dựng hoặc cài đặt.
Để làm cho nó đơn giản, setup.py được chạy như "__main__"
khi bạn gọi các hàm cài đặt , các câu trả lời khác được đề cập. Bên trong setup.py, bạn nên đặt mọi thứ cần thiết để cài đặt gói của mình.
Hai phần sau đây thảo luận về hai điều mà nhiều mô-đun setup.py có.
Hàm này cho phép bạn chỉ định các thuộc tính dự án như tên của dự án, phiên bản .... Quan trọng nhất là chức năng này cho phép bạn cài đặt các chức năng khác nếu chúng được đóng gói đúng cách. Xem trang web này để biết ví dụ về setuptools.setup
Các thuộc tính này của setuptools.setup cho phép cài đặt các loại gói này:
Các gói được nhập vào dự án của bạn và được liệt kê trong PyPI bằng cách sử dụng setuptools.findpackages :
packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])
Các gói không có trong PyPI , nhưng có thể được tải xuống từ một URL bằng cách sử dụng phụ thuộc_links
dependency_links=["http://peak.telecommunity.com/snapshots/",]
Trong một thế giới lý tưởng, setuptools.setup
sẽ xử lý mọi thứ cho bạn. Thật không may, điều này không phải luôn luôn như vậy. Đôi khi bạn phải thực hiện những việc cụ thể, như cài đặt các phụ thuộc bằng lệnh quy trình con , để hệ thống bạn đang cài đặt ở trạng thái phù hợp với gói của bạn. Cố gắng tránh điều này, các chức năng này trở nên khó hiểu và thường khác nhau giữa hệ điều hành và thậm chí phân phối .