Cách tốt nhất để quản lý các phụ thuộc trong Python là gì?

Quản lý phụ thuộc là hành động quản lý tất cả các phần bên ngoài mà dự án của bạn dựa vào. Nó có hồ sơ rủi ro của một hệ thống nước thải. Khi nó hoạt động, bạn thậm chí không biết nó ở đó, nhưng nó trở nên cực kỳ khó chịu và hầu như không thể bỏ qua khi nó bị lỗi

Mọi dự án đều được xây dựng trên mồ hôi và nước mắt của người khác. Những ngày mà một kỹ sư thức dậy, pha cà phê và bắt đầu một dự án mới bằng cách viết bootloader – chương trình khởi động máy tính của bạn từ đầu – đã là lịch sử. Có hàng đống phần mềm và thư viện bên dưới chúng ta. Chúng tôi chỉ đơn giản là rắc lớp đường mỏng của riêng mình lên trên

Máy tính của tôi có một bộ phần mềm khác với máy tính của bạn. Các ngăn xếp không chỉ khác nhau mà còn thay đổi mãi mãi. Thật ngạc nhiên là mọi thứ hoạt động như thế nào, nhưng nó. Tất cả là nhờ hệ thống quản lý phụ thuộc vào hệ thống xử lý nước thải và rất nhiều người thông minh đã trừu tượng hóa các lớp để chúng ta có thể gọi hàm gấu trúc yêu thích của mình và nhận được kết quả có thể dự đoán được

Khái niệm cơ bản về quản lý phụ thuộc Python

Hãy làm rõ một điều. Đơn giản chỉ cần cài đặt và nâng cấp các gói Python không phải là quản lý phụ thuộc. Quản lý phụ thuộc đang ghi lại môi trường cần thiết cho dự án của bạn và giúp người khác tái tạo nó dễ dàng và mang tính quyết định

Bạn có thể viết hướng dẫn cài đặt trên một tờ giấy. Bạn có thể viết chúng trong phần bình luận mã nguồn của mình. Bạn thậm chí có thể mã hóa các lệnh cài đặt thẳng vào chương trình. Quản lý phụ thuộc? . Khuyến khích?

Cách được đề xuất là tách thông tin phụ thuộc khỏi mã theo định dạng được chuẩn hóa, có thể tái sản xuất và được chấp nhận rộng rãi. Điều này cho phép ghim phiên bản và cài đặt xác định dễ dàng. Có nhiều tùy chọn, nhưng chúng tôi sẽ mô tả sự kết hợp cổ điển giữa pip và yêu cầu. txt trong bài viết này

Nhưng trước khi chúng ta đến đó, trước tiên hãy giới thiệu đơn vị nguyên tử của sự phụ thuộc Python. gói

một gói là gì?

"Gói" là một thuật ngữ được xác định rõ trong Python. Các thuật ngữ như thư viện, khung, bộ công cụ không. Chúng tôi sẽ sử dụng thuật ngữ "gói" cho phần còn lại của bài viết này, ngay cả đối với những thứ mà một số người gọi là thư viện, khung hoặc bộ công cụ

Một mô-đun là mọi thứ được định nghĩa trong một tệp Python [các lớp, hàm, v.v. ]

Một gói là một tập hợp các mô-đun

Pandas là một gói, Matplotlib là một gói, print[]-function không phải là một gói. Mục đích của một gói là trở thành một tập hợp các mô-đun có thể phân phối, tái sử dụng và được phiên bản dễ dàng với các phụ thuộc được xác định rõ đối với các gói khác

Có thể bạn đang làm việc với các gói mỗi ngày bằng cách tham chiếu chúng trong mã của bạn bằng câu lệnh Python

source mybubble/bin/activate
0

Nghệ thuật cài đặt các gói

Mặc dù bạn có thể cài đặt các gói bằng cách tải chúng xuống dự án của mình theo cách thủ công, cách phổ biến nhất để cài đặt gói là thông qua PyPi [Chỉ mục gói Python] bằng cách sử dụng lệnh

source mybubble/bin/activate
1 nổi tiếng

Ghi chú. Không bao giờ sử dụng

source mybubble/bin/activate
2. Chẳng bao giờ. Nó giống như chạy một loại virus. Kết quả là không thể đoán trước và sẽ gây ra nỗi đau lớn cho bản thân trong tương lai của bạn

Không bao giờ cài đặt các gói Python trên toàn cầu. Luôn sử dụng môi trường ảo

Môi trường ảo là gì?

Môi trường ảo Python là một bong bóng an toàn. Bạn nên tạo một bong bóng bảo vệ xung quanh tất cả các dự án trên máy tính cục bộ của mình. Nếu bạn không, các dự án sẽ làm tổn thương lẫn nhau. Không để hệ thống nước thải bị rò rỉ

Nếu bạn gọi

source mybubble/bin/activate
3 bên ngoài bong bóng, nó sẽ được cài đặt trên toàn cầu. Điều này thật tệ. Thế giới tiến về phía trước và các gói hàng cũng vậy. Một dự án cần Matplotlib của năm 2019 và dự án kia muốn phiên bản 2021. Một cài đặt toàn cầu duy nhất không thể phục vụ cả hai dự án. Vì vậy, bong bóng bảo vệ là một điều cần thiết. Hãy xem cách sử dụng chúng

Chuyển đến thư mục gốc dự án của bạn và tạo một môi trường ảo

python3 -m venv mybubble

Bây giờ chúng tôi có một bong bóng, nhưng chúng tôi chưa ở trong đó. Chúng ta hãy đi vào

source mybubble/bin/activate

Bây giờ chúng ta đang ở trong bong bóng. Thiết bị đầu cuối của bạn sẽ hiển thị tên môi trường ảo trong ngoặc đơn như thế này

[mybubble] johndoe@hello:~/myproject$

Bây giờ chúng ta đang ở trong bong bóng, việc cài đặt các gói sẽ an toàn. Từ giờ trở đi, mọi lệnh cài đặt pip sẽ chỉ có tác dụng bên trong môi trường ảo. Bất kỳ mã nào bạn chạy sẽ chỉ sử dụng các gói bên trong bong bóng

Nếu bạn liệt kê các gói đã cài đặt, bạn sẽ thấy một danh sách rất ngắn các gói mặc định hiện được cài đặt [như bản thân pip]

pip list

Package       Version
------------- -------
pip           20.0.2 
pkg-resources 0.0.0  
setuptools    44.0.0

Danh sách này không còn dành cho tất cả các gói Python trong máy của bạn, mà là tất cả các gói Python bên trong môi trường ảo của bạn. Ngoài ra, xin lưu ý rằng phiên bản Python được sử dụng bên trong bong bóng là phiên bản Python bạn đã sử dụng để tạo bong bóng

Để rời khỏi bong bóng, chỉ cần gọi lệnh

source mybubble/bin/activate
4

Luôn tạo môi trường ảo cho tất cả các dự án cục bộ của bạn và chạy mã của bạn bên trong [các] bong bóng đó. Nỗi đau từ các phiên bản gói xung đột giữa các dự án là nỗi đau khiến mọi người bỏ việc. Đừng là một trong những người đó

Phiên bản ghim là gì?

Hãy tưởng tượng bạn có một dự án phụ thuộc vào gói Pandas và bạn muốn truyền đạt dự án đó với phần còn lại của thế giới [và chính bạn trong tương lai]. Nên dễ dàng, phải không?

Trước hết, thật mạo hiểm khi chỉ nói. "Bạn cần gấu trúc"

Tùy chọn ít rủi ro hơn là "Bạn cần Pandas 1. 2. 1", nhưng điều đó không phải lúc nào cũng đủ

Giả sử bạn đang ghim chính xác phiên bản Pandas thành 1. 2. 1. Bản thân gấu trúc có một phụ thuộc cho numpy, nhưng thật không may, không ghim phụ thuộc vào một phiên bản numpy chính xác. Bản thân gấu trúc chỉ nói "Bạn cần gọn gàng" và không ghim vào phiên bản chính xác

Lúc đầu, mọi thứ đều ổn, nhưng sau sáu tháng, một phiên bản mới 1. 19. 6 được phát hành với lỗi showstopper

Bây giờ nếu ai đó cài đặt dự án của bạn, họ sẽ nhận được pandas 1. 2. 1 với lỗi numpy 1. 19. 6 và có thể có một vài sợi tóc bạc khi phần mềm của bạn phát sinh các lỗi lạ. Hệ thống nước thải bị rò rỉ. Quá trình cài đặt không xác định

Cách đáng tin cậy nhất là ghim mọi thứ. Ghim phần phụ thuộc của phần phụ thuộc của phần phụ thuộc của phần phụ thuộc của phần phụ thuộc, của… Bạn sẽ hiểu. Pin'em sâu như lỗ thỏ. May mắn thay, có những công cụ giúp bạn thực hiện điều này

Ghi chú. Nếu bạn đang xây dựng một gói có thể tái sử dụng và không phải là một dự án điển hình, thì bạn không nên ghim nó quá mạnh [đây là lý do tại sao Pandas không ghim vào phiên bản Numpy chính xác]. Người dùng cuối của gói được coi là phương pháp hay nhất để quyết định cái gì và mức độ ghim tích cực. Nếu bạn với tư cách là người tạo gói ghim mọi thứ, thì bạn sẽ đóng cánh cửa đó khỏi người dùng cuối

Làm cách nào để ghim các phụ thuộc Python?

Bất cứ khi nào bạn gọi cho

source mybubble/bin/activate
1 để đưa một gói thầu mới hấp dẫn nào đó vào dự án của mình, bạn nên dừng lại và suy nghĩ một chút. Điều này sẽ tạo ra một phụ thuộc mới cho dự án của bạn. Làm thế nào để tôi ghi lại điều này?

Bạn nên ghi các thư viện mới và số phiên bản của chúng vào một yêu cầu. tập tin txt. Đó là một định dạng được hiểu bởi pip để cài đặt nhiều gói trong một lần

# yêu cầu. txt

source mybubble/bin/activate
0

# Cài đặt

source mybubble/bin/activate
1

Điều này đã tốt hơn nhiều so với hầu hết các dự án khoa học dữ liệu mà một người gặp phải, nhưng chúng ta vẫn có thể làm tốt hơn. Hãy nhớ lỗ thỏ phụ thuộc đệ quy từ chương trước về ghim phiên bản. Làm thế nào để chúng tôi làm cho cài đặt xác định hơn?

Câu trả lời là lệnh

source mybubble/bin/activate
6 và tệp văn bản
source mybubble/bin/activate
7

# Yêu cầu. Trong

source mybubble/bin/activate
4

# Tự động tạo yêu cầu. txt

source mybubble/bin/activate
5

# Yêu cầu được tạo. txt

source mybubble/bin/activate
6

trong các yêu cầu. trong bạn chỉ nên đặt các phụ thuộc trực tiếp của mình

Trình biên dịch pip sau đó sẽ tạo ra sự ghim hoàn hảo của tất cả các thư viện vào các yêu cầu. txt, cung cấp tất cả thông tin cho cài đặt xác định. Dễ như ăn bánh. Hãy nhớ cam kết cả hai tệp vào kho git của bạn

Làm cách nào để ghim phiên bản Python?

Ghim phiên bản Python rất khó. Không có cách đơn giản nào để ghim phụ thuộc phiên bản cho chính Python [không sử dụng e. g conda]

Bạn có thể tạo một gói Python từ dự án của mình, gói này cho phép bạn xác định phiên bản Python trong

source mybubble/bin/activate
8 hoặc
source mybubble/bin/activate
9 bằng khóa
[mybubble] johndoe@hello:~/myproject$
0, nhưng điều đó là quá mức cần thiết đối với một dự án khoa học dữ liệu điển hình, vốn thường không có các đặc điểm của một dự án có thể tái sử dụng

Nếu bạn thực sự nghiêm túc về việc ghim vào Python cụ thể, bạn cũng có thể làm điều gì đó như thế này trong mã của mình

source mybubble/bin/activate
0

Cách hiệu quả nhất để buộc phiên bản Python là sử dụng bộ chứa Docker, chúng ta sẽ nói về điều này trong chương tiếp theo

bài học chính

Đừng tránh quản lý phụ thuộc - Bản thân trong tương lai của bạn sẽ đánh giá cao các phụ thuộc được ghi lại khi bạn đổ cà phê lên MacBook của mình

Luôn sử dụng môi trường ảo trên máy tính cục bộ của bạn - Dùng thử thư viện Python bí truyền đó với 2 sao GitHub không phải là vấn đề lớn khi bạn an toàn bên trong bong bóng bảo vệ

Phiên bản ghim tốt hơn là không ghim - Phiên bản ghim bảo vệ khỏi các gói di chuyển về phía trước khi dự án của bạn không được ghim

Các gói thay đổi rất nhiều, Python không quá nhiều - Ngay cả một gói đơn lẻ cũng có thể có hàng tá phụ thuộc lồng nhau và chúng liên tục thay đổi, nhưng Python tương đối ổn định và có khả năng ứng dụng trong tương lai

Còn đám mây thì sao?

Khi dự án của bạn đủ trưởng thành và nâng cấp lên đám mây cũng như đưa vào sản xuất, bạn nên xem xét việc ghim toàn bộ môi trường chứ không chỉ nội dung Python

Đây là nơi các bộ chứa Docker là người bạn tốt nhất của bạn vì chúng không chỉ cho phép bạn ghim phiên bản Python mà còn bất kỳ thứ gì bên trong hệ điều hành. Nó giống như một môi trường ảo nhưng ở quy mô lớn hơn

Chương tiếp theo của chúng tôi sẽ đề cập đến mọi thứ bạn cần biết về Docker, vì vậy hãy chú ý theo dõi

Muốn có thêm lời khuyên kỹ thuật thực tế?

Các nhà khoa học dữ liệu ngày càng là một phần của các nhóm R&D và làm việc trên các hệ thống sản xuất, điều đó có nghĩa là lĩnh vực khoa học dữ liệu và kỹ thuật đang xung đột. Chúng tôi muốn giúp các nhà khoa học dữ liệu không có nền tảng kỹ thuật dễ dàng tìm hiểu các phương pháp hay nhất cơ bản về kỹ thuật

Chúng tôi đang biên soạn hướng dẫn về các chủ đề kỹ thuật mà chúng tôi nghe những người thực hành khoa học dữ liệu nghĩ đến, bao gồm Git, Docker, cơ sở hạ tầng đám mây và phục vụ mô hình

Tải xuống phiên bản xem trước của Thực hành Kỹ thuật dành cho Nhà khoa học Dữ liệu và nhận Sách điện tử đầy đủ khi chúng tôi phát hành

Python quản lý phụ thuộc là gì?

Phần phụ thuộc là tất cả các thành phần phần mềm mà dự án của bạn yêu cầu để dự án hoạt động như dự kiến ​​và tránh lỗi thời gian chạy . Bạn có thể tin tưởng vào PyPI [Chỉ mục gói Python] để cung cấp các gói có thể giúp bạn bắt đầu mọi thứ, từ thao tác dữ liệu đến học máy đến phát triển web, v.v.

Pip có phải là trình quản lý phụ thuộc không?

Mặc dù nhiều nhà phát triển Python sử dụng Pip làm Trình quản lý phụ thuộc, nhưng nó không bao giờ được dự định sử dụng như một . Pip sẽ không gắn cờ xung đột phụ thuộc. Do đó, nó sẽ vui vẻ cài đặt nhiều phiên bản phụ thuộc vào dự án của bạn, điều này có thể dẫn đến lỗi.

Bạn nên sử dụng trình quản lý gói Python nào?

Pip là nơi bắt đầu lý tưởng . Nó đi kèm với Python, dễ hiểu và có rất nhiều tài nguyên liên quan. Tuy nhiên, nếu bạn đang làm việc trên bất kỳ thứ gì khác ngoài dự án cá nhân, bạn có thể sẽ cần tạo môi trường ảo.

Bạn có thể sử dụng công cụ đơn lẻ nào để tạo virtualenv và quản lý các phụ thuộc cho các dự án Python của mình?

Pipenv là trình quản lý phụ thuộc cho phép bạn tạo một môi trường ảo riêng cho từng dự án của mình và tự động quản lý các phụ thuộc trong từng dự án đó.

Chủ Đề