Hướng dẫn how does python handle package dependencies? - python xử lý gói phụ thuộc như thế nào?

Có một số cách tiếp cận khác nhau để đối phó với các phụ thuộc trong Python. Trong bài viết này, tôi sẽ đi qua những ưu và nhược điểm của một số phương pháp phổ biến hơn, và đề xuất một vài lựa chọn thay thế.

Một trong những cơn đau đầu lớn nhất phát sinh khi làm việc với nhiều dự án ở Python là quản lý các phụ thuộc khác nhau giữa chúng. Project A yêu cầu Python 2.7 và phụ thuộc vào các phiên bản cũ hơn của gói, trong khi Project B yêu cầu Python 3.7 với phiên bản gần đây nhất của cùng một gói, cộng với một loạt các loại khác.

Cách dễ nhất để đảm bảo bạn có thể chuyển đổi giữa mỗi dự án mà không lãng phí thời gian để cài đặt các gói mới hoặc khác nhau là gì? Vấn đề này được áp dụng như nhau khi hợp tác với các đồng nghiệp trong cùng một dự án: cách dễ nhất để quản lý các phụ thuộc dự án trên nhiều máy là gì?

Một trong những cách tốt nhất để quản lý các phụ thuộc là sử dụng môi trường ảo. Cách dễ nhất để tạo môi trường ảo là cài đặt Python 3.9 từ ActiveState, sẽ tự động cài đặt Python 3.9 vào môi trường ảo cho bạn để bạn có thể bắt đầu làm việc cho dự án của mình ngay lập tức. Cài đặt Python 3.9install Python 3.9 from ActiveState, which will automatically install Python 3.9 into a virtual environment for you so you can start working on your project right away. Install Python 3.9

Đối với các tùy chọn khác, tiếp tục đọc..

Cài đặt và quản lý các gói với PIP

Trước khi tôi tham gia các giải pháp quản lý phụ thuộc khác nhau, một vài ý kiến ​​về việc cài đặt các gói trong Python. Bất cứ ai sử dụng Python đều biết cách cài đặt các gói. Cách khuyến nghị để làm như vậy là sử dụng & nbsp; pip. Tùy thuộc vào cách cài đặt python trên máy của bạn, & nbsp; pip & nbsp; có thể hoặc chưa được cài đặt. Để kiểm tra, bạn có thể chạy những điều sau trong dòng lệnh:

pip --version

Để biết thêm thông tin về cách cài đặt & nbsp; pip, hãy xem tài liệu & nbsp; ở đây. Để cài đặt một gói cụ thể với & nbsp; pip & nbsp; từ & nbsp; chỉ mục gói python, chạy:

pip install "SomePackage"

Hoặc cho một phiên bản gói cụ thể:

pip install "SomePackage == 1.0"

Điều đáng chú ý là & nbsp; pip & nbsp; không giới hạn ở việc chỉ cài đặt các gói được duy trì trên Chỉ số gói & nbsp; Python. Bạn cũng có thể cài đặt từ một số nguồn khác nhau. Để biết thêm thông tin, hãy xem Tài liệu & NBSP; ở đây. Nó cũng có thể cài đặt nhiều gói cùng một lúc bằng cách sử dụng A & nbsp; aborment.txt & nbsp; file:

pip install -r requirements.txt

Về nguyên tắc, tệp & nbsp; file.txt & nbsp; tệp chỉ đơn giản là một danh sách & nbsp; pip install & nbsp; đối số được thực thi theo thứ tự.

Cài đặt và quản lý các phụ thuộc Python bằng VirtualEnv

VirtualEnv là một công cụ được sử dụng để tạo ra nhiều phiên bản Python bị cô lập. Nó làm như vậy bằng cách tạo một môi trường với thư mục cài đặt riêng và các thư viện tương ứng. Trong môi trường này, các thư viện được cài đặt toàn cầu không thể truy cập được theo mặc định, cũng như không được cài đặt các thư viện trong các môi trường ảo khác.

Theo nghĩa này, mỗi môi trường ảo là một nền tảng bị cô lập mà có thể cài đặt các phụ thuộc duy nhất. Để giải quyết vấn đề của nhiều dự án với các phụ thuộc khác nhau, tất cả những gì cần làm là tạo ra một môi trường cho mỗi dự án. Chuyển đổi giữa các dự án cũng đơn giản như chuyển đổi giữa mỗi môi trường ảo. Để biết các quy trình về cách cài đặt VirtualEnv, hãy xem Tài liệu & NBSP; ở đây.

Những ưu điểm và nhược điểm của việc sử dụng VirtualEnv bao gồm:

Dễ sử dụng: & nbsp; Tạo và sử dụng ảo là đơn giản và dễ dàng. Để tạo môi trường từ dòng lệnh:Creating and using a virtualenv is simple and easy. To create an environment from the command line:

virtualenv ENV

Env là thư mục nơi môi trường ảo mới sẽ sống.

Pip & nbsp; tích hợp && nbsp; aborment.txt: & nbsp; như tôi đã đề cập, & nbsp; pip & nbsp; vẫn là phương thức tiêu chuẩn để cài đặt các gói trong mỗi môi trường ảo. Điều này giúp VirtualEnv dễ dàng áp dụng, đặc biệt là vì & nbsp; aborment.txt & nbsp; có thể được sử dụng để tạo ra sự khởi tạo của từng môi trường tương đối nhanh chóng và đơn giản. Sử dụng tệp A & nbsp; aborments.txt & nbsp; cũng có thể giúp đảm bảo các phụ thuộc được duy trì trên nhiều môi trường hoặc máy móc, mặc dù nó không luôn tạo ra kết quả chính xác. Ví dụ:As I mentioned, pip is still the standard method to install packages within each virtualenv environment. This makes virtualenv easy to adopt, especially since requirements.txt can be used to make the initialization of each environment relatively quick and straightforward. Using a requirements.txt file can also help ensure dependencies are maintained across multiple environments or machines, although it doesn’t always produce the exact same result. For example:

  • Nếu không có phiên bản nào được chỉ định rõ ràng cho mỗi gói trong tệp aborment.txt, & nbsp; pip & nbsp; chỉ cần lấy phiên bản gần đây nhất.
  • Sự phụ thuộc không được giải quyết cho bạn. Ví dụ: nếu tệp aborment.txt có hai phụ thuộc mâu thuẫn (ví dụ: hai phiên bản khác nhau của gói), thì một phiên bản được liệt kê trong tệp được ưu tiên hơn mức được liệt kê thấp hơn. Điều này rõ ràng có thể gây đau đầu và thường sẽ dẫn đến việc phải duy trì phiên bản chính xác của mỗi gói (cũng như tất cả các phụ thuộc phụ).

Quản lý môi trường: & nbsp; Nếu chỉ cần một vài môi trường, VirtualEnv +& nbsp; urmement.txt & nbsp; tiếp cận tập tin hoạt động tốt. Nếu nhiều người là cần thiết, việc tạo ra một số môi trường khác nhau với sự phụ thuộc của chính họ không chỉ tốn thời gian mà còn chiếm rất nhiều không gian trên máy của bạn (và nhiều khả năng là dự phòng). Ngoài ra, việc quản lý tất cả các tệp & nbsp; yêu cầu.txt & nbsp; các tệp trong mỗi môi trường.If only a few environments are needed, the virtualenv + requirements.txt file approach works well. If many are needed, creating several different environments with their own dependencies can not only be time consuming, but also take up a lot of space on your machine (and more than likely be redundant). In addition, it becomes increasingly difficult to manage all the requirements.txt files within each environment.

VirtualEnv được khuyến nghị cho Python lên đến phiên bản 3.3. Thay vào đó, các phiên bản mới hơn của Python nên sử dụng VETV. Cú pháp và chức năng giống hệt nhau, nhưng hiện được bao gồm trong thư viện Python tiêu chuẩn.

Cài đặt và quản lý các phụ thuộc python với pipenv

PipENV thực hiện quản lý phụ thuộc một bước xa hơn VirtualEnv. Mặc dù chức năng rất giống với VirtualEnv, một vài tính năng chính đã được thêm vào để giúp hạn chế một số nhược điểm của việc sử dụng VirtualEnv. Các hướng dẫn cài đặt có thể được tìm thấy ở đây.

Những ưu điểm và nhược điểm của việc sử dụng PIPENV bao gồm:

Dễ sử dụng: PIP và VirtualEnv đã được đơn giản hóa thành một hoạt động duy nhất. Để tạo ra một môi trường ảo với PIPENV:pip and virtualenv have been simplified into a single operation. To create a virtual environment with pipenv:

pipenv ENV

Như trước đây, Env là thư mục nơi môi trường sống. Để cài đặt gói trong môi trường, PipenV được sử dụng thay vì PIP:

pipenv install "SomePackage"

Pipenv sử dụng một pipfile để theo dõi các phụ thuộc. Nếu một pipfile tồn tại, nó sẽ thêm một số người khác vào danh sách các phụ thuộc của nó. Nếu nó không tồn tại, nó sẽ tạo ra một. Tương tự như các yêu cầu.txt, bạn cũng có thể tạo một cài đặt trực tiếp từ một pipfile. Để làm điều này, không chỉ định gói và thay vào đó PipenV sẽ tìm kiếm một pipfile: thay vào đó:

pipenv install

Pipfile & pipfile.lock: Ngoài Pipfile, PipENV tạo ra một pipfile.lock có chứa phiên bản chính xác và tệp nguồn của mỗi gói được cài đặt. Điều này không chỉ bao gồm cả một số người khác, mà còn là tất cả các phụ thuộc của một số người.In addition to the Pipfile, pipenv generates a pipfile.lock that contains the exact version and source file hash of each package installed. This not only includes “SomePackage,” but also all the dependencies of “SomePackage.”

Pipfile.lock là một giải pháp thay thế cho các yêu cầu.txt cải thiện khái niệm bằng cách bao gồm độ phân giải phụ thuộc tích hợp. Pipfile.Lock cố gắng giải quyết mọi xung đột giữa các gói-bao gồm cả sự phụ thuộc phụ của chúng-bằng cách tải các phiên bản gói đáp ứng tất cả các yêu cầu.

Nếu không có giải pháp nào tồn tại, pipfile.lock không thể được tạo và lỗi là đầu ra. Điều này ngăn chặn các loại vấn đề phát sinh từ việc sử dụng các yêu cầu.txt, chẳng hạn như kiểm soát phiên bản thực hiện thủ công trên các phụ thuộc và phụ thuộc phụ.

Biểu đồ phụ thuộc: Khi xử lý các phụ thuộc phức tạp, nó cực kỳ hữu ích để có thể hình dung cách chúng liên quan. Cuối cùng, PipenV bao gồm một phương pháp để trực quan hóa các phụ thuộc của bạn:When dealing with complex dependencies, it’s extremely helpful to be able to visualize how they relate. To that end, pipenv includes a method to visualize your dependencies:

pipenv graph

Điều này tạo ra một đầu ra sạch sẽ và dễ dàng để liệt kê tất cả các phụ thuộc.

Quản lý môi trường: Thật không may, Pipenv không giúp đỡ trong việc quản lý các môi trường ảo sinh sôi nảy nở. Nó cũng không giải quyết các yêu cầu bộ nhớ ảo có thể gây khó khăn cho người dùng cần nhiều môi trường ảo trên một máy.Unfortunately, pipenv doesn’t help with the management of proliferating virtual environments. Nor does it resolve the virtualenv memory requirements that can plague users that need many virtual environments on a single machine.

Quản lý phụ thuộc Python - Giải pháp thay thế

Sử dụng VETV và PipENV là hai phương pháp quản lý các phụ thuộc trong Python. Chúng đơn giản để thực hiện và, đối với hầu hết người dùng, các giải pháp đầy đủ để 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ọ.

Nếu bạn đang sử dụng VENV hoặc PipenV, nó cũng có thể khiến bạn sử dụng GitHub. GitHub cung cấp các cảnh báo lỗ hổng tự động cho các phụ thuộc trong kho lưu trữ của bạn. Bằng cách tải lên một yêu cầu.txt hoặc pipfile.lock với mã của bạn, GitHub kiểm tra bất kỳ xung đột nào, gửi cảnh báo cho quản trị viên nếu phát hiện bất kỳ và thậm chí có thể tự động giải quyết các lỗ hổng. Nó cũng tạo ra một cây phụ thuộc dưới tab Insights của kho lưu trữ của bạn.

Một giải pháp khác để quản lý các phụ thuộc là nền tảng Activeestate, có thể tự động giải quyết tất cả các phụ thuộc cho dự án của bạn và biên dịch chúng (các gói, phụ thuộc và phụ thuộc phụ) vào thời gian chạy cho hệ điều hành bạn sử dụng. Mỗi lần cập nhật gói hoặc phụ thuộc, nền tảng ActiveSestate có thể xây dựng lại thời gian chạy trong khi đảm bảo khả năng tương thích giữa tất cả các phụ thuộc và phụ thuộc phụ

Quản lý phụ thuộc trong hành động

Nhận được sự đánh giá cao thực hành về cách nền tảng ActiveState có thể giúp bạn quản lý các phụ thuộc của mình ForPython Môi trường. & NBSP; Python environments

Tận dụng công cụ dựa trên đám mây của chúng tôi, và tự động tạo và kích hoạt môi trường ảo! Chỉ cần chạy lệnh sau để cài đặt Python 3.9 và trình quản lý gói của chúng tôi, công cụ trạng thái: & nbsp;

các cửa sổ

powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1'))) -activate-default ActiveState-Labs/Python-3.9Beta"

Linux

pip install "SomePackage"
0

Bây giờ bạn có thể chạy cài đặt trạng thái. Tìm hiểu thêm về cách sử dụng công cụ trạng thái để quản lý môi trường Python của bạn. & NBSP;state install . Learn more about how to use the State Tool to manage your Python environment. 

Hãy cho chúng tôi biết kinh nghiệm của bạn trong diễn đàn cộng đồng ActiveState.ActiveState Community forum.

Bước tiếp theo

  • Đăng ký một tài khoản nền tảng hoạt động miễn phí và xem các khả năng quản lý phụ thuộc của nó cho chính bạn bằng cách xây dựng môi trường thời gian chạy của riêng bạn.
  • Để tìm hiểu thêm về quản lý phụ thuộc trong môi trường ảo, hãy đọc lý do tại sao pipenv> bài đăng trên blog của VENV.

Đề xuất đọc

Quản lý phụ thuộc Python

Tại sao pipenv> venv

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

Sử dụng VETV và PipENV là hai phương pháp quản lý các phụ thuộc trong Python. Chúng đơn giản để thực hiện và, đối với hầu hết người dùng, các giải pháp đầy đủ để 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ọ.. They are simple to implement and, for most users, adequate solutions for handling multiple projects with different dependencies. However, they are not the only solutions. Other services can complement their use.

Các gói được quản lý như thế nào trong Python?

PIP: Trình quản lý gói tiêu chuẩn PIP được tích hợp cho Python và có thể cài đặt các gói từ nhiều nguồn khác nhau. Nhưng pypi.org là nguồn gói chính và mặc định được sử dụng. Theo mặc định, PIP cài đặt các gói lên môi trường Python toàn cầu của dự án dẫn đến các gói có thể truy cập được bởi tất cả các dự án. Pip is built-in to Python, and can install packages from many different sources. But PyPI.org is the primary and default package source used. By default, pip installs packages onto a project's global Python environment resulting in packages being accessible by all projects.

Python tìm kiếm sự phụ thuộc ở đâu?

Python tìm kiếm các mô -đun trong Sys Sys.Nó tìm kiếm một tệp được gọi là a_module.py trong các thư mục được liệt kê trong sys biến.sys. It looks for a file called a_module.py in the directories listed in the variable sys.

Pip có tự động cài đặt không?

PIP dựa vào các tác giả gói để quy định các phụ thuộc cho mã của họ để tải xuống thành công và cài đặt gói cộng với tất cả các phụ thuộc cần thiết từ Chỉ số gói Python (PYPI).Nhưng nếu các gói được cài đặt cùng một lúc, nó có thể dẫn đến xung đột phụ thuộc.