Thiết lập là gì?


991

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?


7
Eric: Những ví dụ tốt hơn để đặt mọi thứ lại với nhau sẽ có ích
Das.Rot

1
Đối với tôi, luôn cảm thấy kỳ lạ khi cài đặt gói bạn giải nén và chạy tập lệnh bên trong, thay vì chỉ trình quản lý gói vào những gì bạn đã tải xuống. Điều đó sẽ tự nhiên hơn. stackoverflow.com/questions/1471994/what-is-setup-py/áp
Đại tá Panic

Câu trả lời:


694

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


9
Tôi sẽ đánh giá cao nếu bạn chia sẻ kiến ​​thức của bạn về cách tạo hoặc xử lý các mô-đun này? Ví dụ: cách tạo mô-đun cơ bản hoặc cách kiểm tra tập lệnh trên ./mymodule/bin nhập từ ./mymodule/libs/
Paulo Oliveira

7
@PauloOliveira Xem Phân phối Mô-đun Python mô tả Distutils, cụ thể xem xét 2. Viết Tập lệnh thiết lập .
Yous

4
KHÔNG BAO GIỜ SỬ DỤNG cài đặt python cài đặt! Nó phá vỡ phiên bản của bạn! stackoverflow.com/questions/4324558/
hy

2
@MikeS Tôi không biết chắc chắn cách giải quyết là gì, nhưng tôi có thể nói với bạn rằng việc chạy setup.py đã dẫn tôi đến những vấn đề ác mộng cần nhiều giờ dọn dẹp. Tôi đoán rằng xây dựng / bó với pip hoặc conda sẽ là giải pháp.
devinbost

3
Bạn có thể thay đổi liên kết thành docs.python.org/3/installing/index.html , đây là liên kết tài liệu không phải là di sản, và cũng tốt hơn nếu thêm một liên kết đến bao bì packthonthon.org / tutorials / distribution- gói / # setup-py nơi nó hiển thị mục đích của setup.pytệp.
Alvaro Gutierrez Perez

493

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óimô-đ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',
           ]
)

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


12
Kenneth Reitz (tác giả của người đáng kính requests) có dự án này để đưa ra một ví dụ rõ ràng về setup.py - github.com/kennethreitz/setup.py
Boweeb

Còn các gói phụ, tức là các thư mục có các mô-đun bên trong gói thì sao?
fhchl

1
@ kmario23 Giải thích hay, cảm ơn bạn!
Dinko Pehar

1
Tôi thích câu trả lời này
SW_user2953243

1
@ SW_user2953243 Tôi rất vui vì bạn thấy nó hữu ích :)
kmario23

98

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).


1
Vì vậy, theo sự tương tự ở trên, nếu việc xây dựng mô-đun thất bại vì một số lý do, tôi sẽ sửa lại tập lệnh setup.py ... đúng không?
MonaLisaOverdrive

1
Vâng, cũng có thể có một số tập tin cấu hình bạn có thể xem.
whatnick

3
Sửa lỗi cho tôi nếu tôi sai, nhưng tôi tin rằng có một sự khác biệt nhỏ giữa hai điều này. 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.
joelostblom

6
@cheflo Trên thực tế 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.
ntninja

3
Tôi cần một số người cho tôi biết liệu chúng ta có còn nên sử dụng setup.py nữa hay không theo tài liệu tại docs.python.org/3/installing/index.html "Trong khi việc sử dụng trực tiếp các distutils đang được loại bỏ, ... "
Kemin Zhou


20

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.

http://docs.python.org/distutils/


19

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

Cảm ơn vì python setup.py --help-commands. Rất hữu ích khi đào sâu vào setup.py.
Palec

8

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!


7

Để 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ó.


1
Sau đó, bạn có thể sử dụng easy_install hoặc tương tự. Btw, Python có trứng, loại tương tự như đá quý ruby.
Pavel imerda

7

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.


6

Để 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.

Các chức năng thiết lập chung

Hai phần sau đây thảo luận về hai điều mà nhiều mô-đun setup.py có.

setuptools.setup

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/",]

Chức năng tùy chỉnh

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 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.