Bất cứ ai có thể giải thích những gì setup.pyvà 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.pyvà 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 .
pipsẽ sử dụng setup.py để cài đặt mô-đun của bạn. Tránh gọi setup.pytrực tiếp.
https://docs.python.org/3/installing/index.html#installing-index
setup.pytệp.
Nó giúp cài đặt gói python footrên máy của bạn (cũng có thể ở trong virtualenv) để bạn có thể nhập gói footừ 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_installv.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__.pytệp.
Mô-đun - Một tệp python hợp lệ có .pyphầ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.pytậ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.pytrong 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.pytừ 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.pylà câu trả lời của Python cho trình cài đặt và maketệ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 installdị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ư gcchoặc cl) và mô-đun giao tiếp Python (như swighoặc pyrex).
python setup.py install thực sự chạy python setup.py buildtrướ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 makeluôn cần phải được chạy thủ công trước khi chạy make install.
makekhô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 maketrước make installhay 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.pylà 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 distutilskhung 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.pymở 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.pycuố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.pylà 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.pysao 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.pylà 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 piptheo 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.pytệ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_installect).
Phương pháp này thường được sử dụng khi pipsẽ 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 pipcó 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 installsẽ 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.pylà 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.pytậ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.pytậ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 distutilsnhư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.setupsẽ 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 .