Làm thế nào để python đối phó với các phụ thuộc?

Khá đáng sợ phải không? . Điều này cũng có thể dẫn đến tình huống quá quen thuộc "Nó đã hoạt động khi tôi xây dựng nó ngày hôm qua".  

Bài viết này sẽ giải thích cách các gói không mong muốn lẻn vào mã của bạn, mô tả cách sử dụng các yêu cầu. txt để đảm bảo các bản dựng có thể lặp lại và chỉ ra cách Người tiêu dùng gói có thể nhanh chóng xác định ứng dụng nào đang sử dụng một gói cụ thể

Tác dụng phụ ngoài ý muốn của giải pháp phụ thuộc

Các gói Python thường phụ thuộc vào các gói khác được gọi là gói phụ thuộc. Các phụ thuộc này có thể có các phụ thuộc riêng, dẫn đến một cây phụ thuộc phức tạp

 

Nếu bạn đang xây dựng một ứng dụng bằng Python và hai gói yêu cầu các phiên bản khác nhau của cùng một gói, thì Python sẽ có xung đột phiên bản và dự án của bạn có thể không được xây dựng

Khi tải xuống các dự án từ pypi. org, các gói phụ thuộc không được liệt kê. Thay vào đó, có thể thấy các phụ thuộc gói bằng một trong các lệnh sau trong Python

  • chương trình pip. Liệt kê các phụ thuộc của các gói Python đã được cài đặt
  • pipdeptree. Liệt kê các phụ thuộc ở dạng cây
  • danh sách pip. Liệt kê các gói đã cài đặt với các điều kiện khác nhau

Khi cài đặt gói Python bằng cách sử dụng cài đặt pip, pip sẽ cố gắng tự động tìm ra các phần phụ thuộc của gói được yêu cầu. Trong quá trình này, pip sẽ đưa ra các giả định về các phiên bản gói cần thiết và sau đó kiểm tra xem các giả định đó có đúng không. Nếu bất kỳ giả định nào được phát hiện là không chính xác, sẽ được sử dụng.

Quay lui giúp giảm nguy cơ cài đặt gói mới vô tình phá vỡ gói hiện có và làm rối tung môi trường của bạn. Pip sẽ cố gắng hết sức để đảm bảo rằng nó cài đặt các gói phụ thuộc lý tưởng, nhưng nó không hoàn hảo và xung đột phiên bản sẽ xảy ra.
chắc chắn xảy ra. Điều này thường được giải quyết bằng cách sử dụng thông số phiên bản

được sử dụng để ra lệnh phiên bản nào của gói được chấp nhận. Điều này cho phép bạn có nhiều quyền kiểm soát hơn đối với những gói nào được tự động thêm vào dự án của bạn, nhưng nó có thể có một số tác dụng phụ không mong muốn

Giả sử bạn cài đặt urllib3 từ pypi. tổ chức. Các phụ thuộc cần thiết cho urllib3 có thể được nhìn thấy bên dưới

 

Một trong những gói urllib3 phụ thuộc vào là mật mã. Trình xác định phiên bản được sử dụng để yêu cầu urllib3 chấp nhận bất kỳ phiên bản mật mã nào lớn hơn hoặc bằng 1. 3. 4. Điều này đảm bảo rằng hầu hết các xung đột phiên bản sẽ tránh được, nhưng như đã đề cập trước đó, nó đi kèm với một số hậu quả không mong muốn

Ảnh chụp màn hình ở trên hiển thị một số cập nhật cho mã hóa gói. Vì các trình xác định phiên bản đã được sử dụng để yêu cầu urllib3 chấp nhận bất kỳ phiên bản mật mã nào lớn hơn hoặc bằng 1. 3. 4. , ứng dụng của bạn sẽ tự động bao gồm một gói mới bất cứ khi nào mật mã được cập nhật

Việc tự động chấp nhận các gói của bên thứ ba chưa được xác minh có thể dẫn đến

  1. Các bản dựng không thể đoán trước dẫn đến tình huống "nó đã hoạt động khi tôi xây dựng nó ngày hôm qua"
  2. Các gói độc hại hoặc không an toàn lẻn vào mã của bạn

Rất may, Python có một công cụ cho phép bạn có nhiều quyền kiểm soát hơn đối với các gói phụ thuộc của mình và giúp giảm thiểu rủi ro đi kèm với các trình xác định phiên bản. Yêu cầu. tập tin txt

Thực hành tốt nhất. Yêu cầu sử dụng. txt cho các bản dựng có thể lặp lại

Khi chia sẻ dự án với người khác, sử dụng hệ thống bản dựng hoặc sao chép dự án đến bất kỳ vị trí nào khác mà bạn cần khôi phục môi trường, bạn cần chỉ định các gói bên ngoài mà dự án yêu cầu

Điều này thường được thực hiện bằng cách sử dụng pip freeze > các yêu cầu. txt , ghi danh sách gói hiện tại của môi trường vào các yêu cầu. txt. Vì chứa phiên bản được ghim của mọi thứ đã được cài đặt khi pip freezewas chạy, nó có thể được sử dụng để đảm bảo rằng các gói ban đầu được sử dụng trong quá trình phát triển giống như các gói được sử dụng khi người khác xây dựng ứng dụng.

Yêu cầu sử dụng. txt có thể được thực hiện trong hai bước đơn giản

1. Sử dụng đóng băng pip để xuất các gói đã cài đặt phù hợp với tệp yêu cầu

C:\> py -m pip freeze

docutils==0.11

Jinja2==2.7.2

MarkupSafe==0.19

Pygments==1.6

Sphinx==1.2.2

2. Tạo một tệp yêu cầu và sau đó cài đặt nó vào một môi trường khác

env1\bin\python -m pip freeze > requirements.txt

env2\bin\python -m pip install -r requirements.txt

 

Yêu cầu. txt đảm bảo các bản dựng có thể dự đoán được, nhưng chúng không loại bỏ hoàn toàn các vấn đề phụ thuộc

Coi chừng các lỗ hổng mới

Ngay cả với các chỉ định phiên bản, yêu cầu. txt và quy trình phê duyệt gói, có thể một lỗ hổng mới sẽ được phát hiện trong phần phụ thuộc.  Lỗ hổng này sau đó có thể ảnh hưởng đến bất kỳ ứng dụng nào sử dụng nó. Vậy bạn có thể làm gì? 

Bạn có thể tự kiểm tra yêu cầu. txt của tất cả các ứng dụng của bạn để xem ứng dụng nào đang sử dụng phần phụ thuộc không mong muốn, nhưng còn rất nhiều việc phải làm.   Ngoài ra, bạn có thể sử dụng tính năng Gói tiêu dùng của ProGet để tự động thực hiện việc này.

Thực hành tốt nhất. Sử dụng Người tiêu dùng Gói để Theo dõi Phụ thuộc

Tính năng Gói tiêu dùng của ProGet hiển thị tất cả các ứng dụng đang "tiêu thụ" hoặc sử dụng một gói cụ thể. Để minh họa cách hoạt động của tính năng này, hãy xem lại gói

Urllib3 là ứng dụng khách HTTP rất phổ biến và mạnh mẽ, thân thiện với người dùng dành cho Python. Tính đến thời điểm viết 4780 gói phụ thuộc vào urllib3. Năm 2021 phát hiện lỗ hổng từ chối dịch vụ ở phiên bản 1. 26. 4. Bất kỳ ứng dụng nào sử dụng gói phụ thuộc vào urllib3 và được cập nhật tự động lên phiên bản 1. 26. 4, sau đó sẽ vô tình có một gói dễ bị tổn thương được đưa vào mã của họ

Đây là một trường hợp sử dụng hoàn hảo cho ProGets Package Consumer. Sau khi xây dựng ứng dụng của bạn, Người tiêu dùng gói sử dụng pgscan để quét đầu ra của bản dựng, tìm kiếm các phiên bản gói cụ thể mà ứng dụng sử dụng và xuất bản dữ liệu đó lên ProGet cùng với tên và phiên bản ứng dụng của bạn



Nhờ tính năng Gói tiêu dùng, chúng ta có thể thấy rằng urllib3 1. 26. 4  là phần phụ thuộc trong các ứng dụng ThatOtherApp, MyApp và OtherApp. Bây giờ chúng ta đã biết những ứng dụng nào đang bị ảnh hưởng bởi urllib3 1. 26. 4  chúng tôi có thể nhanh chóng thực hiện các thay đổi có liên quan

Khi một gói dễ bị tấn công được phát hiện, việc tìm ra ứng dụng nào đang sử dụng gói này càng nhanh càng tốt sẽ rất quan trọng. Đây chính là lý do tại sao chúng tôi tạo ra Người tiêu dùng trọn gói 😀

Python trong Doanh nghiệp

Yêu cầu sử dụng. txt, quy trình phê duyệt gói và Trình tiêu dùng gói của ProGet sẽ giúp đảm bảo các bản dựng có thể dự đoán được và loại bỏ các gói không mong muốn khỏi chúng

Tuy nhiên, Python có thể là một ngôn ngữ phức tạp để làm việc và vẫn còn nhiều điều cần tìm hiểu nếu bạn muốn sử dụng hiệu quả Python trong doanh nghiệp. Đọc hướng dẫn của chúng tôi để nâng cao kỹ năng Python của bạn và thành thạo Python trong doanh nghiệp.  

Python xử lý các phụ thuộc như thế nào?

Sử dụng venv và pipenv là hai phương pháp quản lý các phụ thuộc trong Python. Chúng rất đơn giản để triển khai và đối với hầu hết người dùng, các giải pháp phù hợp để xử lý nhiều dự án với các phụ thuộc khác nhau. Tuy nhiên, chúng không phải là giải pháp duy nhất. Các dịch vụ khác có thể bổ sung cho việc sử dụng của họ.

Python cài đặt phụ thuộc ở đâu?

tệp txt. Các phần phụ thuộc sẽ được tải xuống thư mục \pkgs trong thư mục gốc Anaconda\Conda . Thư mục gốc trong cả Linux và Windows là thư mục cài đặt Anaconda\Conda.

Làm cách nào để cài đặt các phụ thuộc trong Python?

Cài đặt phần phụ thuộc Python .
Cài đặt gói từ PyPI
Cài đặt từ kho lưu trữ công cộng
Cài đặt từ kho lưu trữ Artifact Registry
Cài đặt từ kho lưu trữ riêng
Cài đặt thư viện Python cục bộ
Sử dụng các gói phụ thuộc vào thư viện đối tượng được chia sẻ

Tại sao quản lý phụ thuộc Python?

Quản lý phụ thuộc Python là cần thiết cho sự ổn định của các dự án của bạn . Nếu ứng dụng Python của bạn dựa vào các thư viện và framework của bên thứ ba để hoạt động, thì việc quản lý chúng đúng cách có thể giúp bạn gặt hái những phần thưởng về tính bảo mật, tính bền vững và tính nhất quán.

Chủ Đề