Câu trả lời ngắn gọn là chỉ requirements.txt
dành cho các yêu cầu về gói danh sách. setup.py
mặt khác giống một tập lệnh cài đặt hơn. Nếu bạn không có kế hoạch cài đặt mã python, thông thường bạn sẽ chỉ cần requirements.txt
.
Tệp setup.py
mô tả, ngoài các phụ thuộc gói, tập hợp các tệp và mô-đun nên được đóng gói (hoặc được biên dịch, trong trường hợp mô-đun gốc (tức là được viết bằng C)) và siêu dữ liệu để thêm vào danh sách gói python ( ví dụ: tên gói, phiên bản gói, mô tả gói, tác giả, ...).
Vì cả hai tệp đều liệt kê các phụ thuộc, điều này có thể dẫn đến một chút trùng lặp. Đọc bên dưới để biết chi tiết.
request.txt
Tệp này liệt kê các yêu cầu về gói python. Đây là một tệp văn bản thuần túy (tùy chọn với các nhận xét) liệt kê các gói phụ thuộc của dự án python của bạn (một gói trên mỗi dòng). Nó không mô tả cách mà gói python của bạn được cài đặt. Bạn thường sử dụng tệp yêu cầu với pip install -r requirements.txt
.
Tên tệp của tệp văn bản là tùy ý, nhưng thường là requirements.txt
theo quy ước. Khi khám phá kho mã nguồn của các gói python khác, bạn có thể gặp phải các tên khác, chẳng hạn như dev-dependencies.txt
hoặc dependencies-dev.txt
. Chúng phục vụ cùng mục đích dependencies.txt
nhưng thường liệt kê các phụ thuộc bổ sung mà các nhà phát triển gói cụ thể quan tâm, cụ thể là để kiểm tra mã nguồn (ví dụ: pytest, pylint, v.v.) trước khi phát hành. Người dùng của gói nói chung sẽ không cần toàn bộ tập hợp các phụ thuộc của nhà phát triển để chạy gói.
Nếu có nhiều requirements-X.txt
biến thể, thì thường một biến thể sẽ liệt kê các phụ thuộc thời gian chạy và các phụ thuộc thời gian xây dựng hoặc thử nghiệm khác. Một số dự án cũng phân tầng tệp yêu cầu của họ, tức là khi một tệp yêu cầu bao gồm tệp khác ( ví dụ ). Làm như vậy có thể giảm sự lặp lại.
setup.py
Đây là một tập lệnh python sử dụng setuptools
mô-đun để xác định một gói python (tên, tệp bao gồm, siêu dữ liệu gói và cài đặt). Nó cũng sẽ requirements.txt
liệt kê các phụ thuộc thời gian chạy của gói. Setuptools là cách thực tế để xây dựng và cài đặt các gói python, nhưng nó có những khuyết điểm, theo thời gian đã làm nảy sinh sự phát triển của các "trình quản lý gói meta" mới, như pip. Các thiếu sót ví dụ của setuptools là không có khả năng cài đặt nhiều phiên bản của cùng một gói và thiếu lệnh gỡ cài đặt.
Khi người dùng python thực hiện pip install ./pkgdir_my_module
(hoặc pip install my-module
), pip sẽ chạy setup.py
trong thư mục (hoặc mô-đun) đã cho. Tương tự, bất kỳ mô-đun nào có một setup.py
đều có thể được pip
cài đặt, ví dụ bằng cách chạy pip install .
từ cùng một thư mục.
Tôi có thực sự cần cả hai không?
Câu trả lời ngắn gọn là không, nhưng thật tuyệt khi có cả hai. Chúng đạt được các mục đích khác nhau, nhưng cả hai đều có thể được sử dụng để liệt kê các phụ thuộc của bạn.
Có một thủ thuật bạn có thể cân nhắc để tránh trùng lặp danh sách các phụ thuộc giữa requirements.txt
và setup.py
. Nếu bạn đã viết một setup.py
gói hoạt động hoàn toàn cho gói của mình và các phần phụ thuộc của bạn chủ yếu là bên ngoài, bạn có thể xem xét việc có một đơn giản requirements.txt
chỉ với những điều sau:
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
Đây -e
là một pip install
tùy chọn đặc biệt cài đặt gói đã cho ở chế độ có thể chỉnh sửa . Khi pip -r requirements.txt
được chạy trên tệp này, pip sẽ cài đặt các phần phụ thuộc của bạn thông qua danh sách trong ./setup.py
. Tùy chọn có thể chỉnh sửa sẽ đặt một liên kết biểu tượng trong thư mục cài đặt của bạn (thay vì một quả trứng hoặc bản sao lưu trữ). Nó cho phép các nhà phát triển chỉnh sửa mã tại chỗ từ kho mà không cần cài đặt lại.
Bạn cũng có thể tận dụng những gì được gọi là "phần bổ sung của setuptools" khi bạn có cả hai tệp trong kho lưu trữ gói của mình. Bạn có thể xác định các gói tùy chọn trong setup.py trong một danh mục tùy chỉnh và cài đặt các gói đó chỉ từ danh mục đó bằng pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
và sau đó, trong tệp yêu cầu:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Điều này sẽ giữ tất cả danh sách phụ thuộc của bạn bên trong setup.py.
Lưu ý : Bạn thường thực thi pip và setup.py từ hộp cát, chẳng hạn như các hộp được tạo bằng chương trình virtualenv
. Điều này sẽ tránh cài đặt các gói python bên ngoài ngữ cảnh của môi trường phát triển dự án của bạn.