Python: Pip là gì?

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Mục lục bài viết:


pip là gì? pip là trình quản lý gói tiêu chuẩn cho Python. Nó cho phép bạn cài đặt và quản lý các gói bổ sung không phải là một phần của thư viện chuẩn Python. Hướng dẫn này là phần giới thiệu pip cho Pythonistas mới.

Trong hướng dẫn này, bạn sẽ tìm hiểu về:

  • Cài đặt các gói bổ sung không có trong bản phân phối Python chuẩn
  • Tìm các gói được xuất bản lên Chỉ mục gói Python (PyPI)
  • Quản lý các yêu cầu đối với tập lệnh và ứng dụng của bạn
  • Gỡ cài đặt các gói và phụ thuộc của chúng

Như bạn sẽ thấy, cộng đồng Python rất tích cực và đã tạo ra một số lựa chọn thay thế cho pip mà bạn sẽ tìm hiểu ở phần sau trong hướng dẫn này.

Bắt đầu với pip

Vậy, pip là gì? pip là một trình quản lý gói cho Python. Điều đó có nghĩa là nó là một công cụ cho phép bạn cài đặt và quản lý các thư viện bổ sung và các phần phụ thuộc không được phân phối như một phần của thư viện chuẩn.

Quản lý gói rất quan trọng và pip đã được bao gồm trong trình cài đặt Python kể từ các phiên bản 3.4 cho Python 3 và 2.7.9 cho Python 2, và nó được sử dụng bởi nhiều dự án Python, điều này làm cho nó trở thành một công cụ cần thiết cho mọi Pythonista.

Khái niệm về trình quản lý gói có thể quen thuộc với bạn nếu bạn đến từ các ngôn ngữ khác. JavaScript sử dụng npm để quản lý gói, Ruby sử dụng gem và .NET sử dụng NuGet. Trong Python, pip đã trở thành trình quản lý gói tiêu chuẩn.

Trình cài đặt Python đã cài đặt pip, vì vậy nó sẽ sẵn sàng để bạn sử dụng, trừ khi bạn đã cài đặt phiên bản Python cũ. Bạn có thể xác minh rằng pip có sẵn bằng cách chạy lệnh sau trong bảng điều khiển của bạn:

$ pip --version

Bạn sẽ thấy một kết quả tương tự hiển thị phiên bản pip, cũng như vị trí và phiên bản của Python. Nếu bạn đang sử dụng phiên bản Python cũ không có pip, thì bạn có thể cài đặt nó bằng cách làm theo hướng dẫn cho hệ thống của bạn trong Tài liệu cài đặt pip.

Cài đặt các gói với pip

Python được coi là một ngôn ngữ bao gồm pin. Điều này có nghĩa là thư viện chuẩn Python bao gồm một tập hợp các gói và mô-đun mở rộng để trợ giúp các nhà phát triển với các tập lệnh và ứng dụng của họ.

Đồng thời, Python có một cộng đồng rất tích cực đóng góp một tập hợp các gói thậm chí còn lớn hơn có thể giúp bạn đáp ứng nhu cầu phát triển của mình. Các gói này được xuất bản lên Chỉ mục gói Python, còn được gọi là PyPI (phát âm là Pie Pea Eye). PyPI lưu trữ một bộ sưu tập mở rộng các gói bao gồm các framework phát triển, công cụ và thư viện.

Nhiều gói trong số này đơn giản hóa việc phát triển Python bằng cách cung cấp các giao diện thân thiện cho chức năng đã tồn tại trong thư viện chuẩn. Ví dụ: bạn có thể viết một tập lệnh truy xuất nội dung của một trang web chỉ bằng cách sử dụng các thư viện tiêu chuẩn được bao gồm trong Python:

# In using-http.py

import cgi
import http.client

server = 'www.google.com'
url = '/'
conn = http.client.HTTPSConnection(server)
conn.request('GET', url)
response = conn.getresponse()
content_type = response.headers.get('Content-Type')
_, params = cgi.parse_header(content_type)
encoding = params.get('charset')
data = response.read()
text = data.decode(encoding)

print(f'Response returned: {response.status} ({response.reason})')
print('Body:')
print(text)

Trong tập lệnh này, bạn import cgi và http.client, cả hai đều được đưa vào thư viện chuẩn Python. Bạn tạo một đối tượng HTTPSConnection chỉ định máy chủ và gọi  .request() và .getresponse() của nó để truy xuất phản hồi.

Từ phản hồi, bạn có thể truy xuất tiêu đề Content-Type và phân tích cú pháp nó bằng cách sử dụng module cgi để trích xuất bộ ký tự mà trang được mã hóa.

cgi.parse_header() trả về một bộ giá trị chính và một từ điển các tham số. Ví dụ: tiêu đề Content-Type có thể chứa giá trị như text/html; charset=ISO-8859-1.

Bộ tuple sẽ chứa chuỗi text/html làm phần tử đầu tiên và phần tử thứ hai sẽ là một từ điển trong biểu mẫu {'charset': 'ISO-8859-1'}. Bởi vì bạn chỉ quan tâm đến các tham số charset, bạn có thể bỏ qua việc bắt đầu của tuple bằng cách sử dụng một dấu gạch dưới: _, params = cgi.parse_header(content_type).

Lưu ý: Ý nghĩa của dấu gạch dưới trong Python giải thích cách sử dụng dấu gạch dưới để giải nén các giá trị từ một bộ giá trị.

Khi bạn có mã hóa của trang, bạn có thể đọc phản hồi và giải mã nó thành văn bản. Bạn có thể chạy ví dụ trong bảng điều khiển để xem nó hoạt động như thế nào:

$ python using-http.py

Response returned: 200 (OK)
Body:
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" 
lang="en"><head><meta content="Search the world's information, including 
webpages, images, videos and more. Google has many special features to help you 
find exactly what you're looking for." name="description"><meta content="noodp" 
name="robots">... Additional Output Omitted

Điều này có vẻ như rất nhiều công việc đối với một tập lệnh nhỏ để truy xuất nội dung của một trang web. May mắn thay, có một gói Python giúp đơn giản hóa các yêu cầu HTTP và cung cấp một giao diện đẹp để thực hiện chính xác những gì bạn muốn.

Cài đặt gói cơ bản

PyPI lưu trữ một thư viện rất phổ biến để thực hiện các yêu cầu HTTP được gọi requests. Bạn có thể tìm hiểu tất cả về requests trong trang web tài liệu chính thức.

Bước đầu tiên là cài đặt gói requests vào môi trường của bạn. Bạn có thể tìm hiểu về các lệnh hỗ trợ pip bằng cách chạy nó với help:

$ pip help

Usage:
  pip <command> [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible 
                              dependencies.
  config                      Manage local and global configuration.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment 
                              variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be 
                              used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be 
                              used up to 3 times (corresponding to WARNING, 
                              ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form 
                              [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should 
                              attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: 
                              (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).
  --trusted-host <hostname>   Mark this host as trusted, even though it does 
                              not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file 
                              containing the private key and the certificate in 
                              PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine 
                              whether a new version of pip is available for 
                              download. Implied with --no-index.

Như bạn có thể thấy, pip cung cấp một lệnh install để cài đặt các gói. Bạn có thể chạy nó để cài đặt gói requests:

$ pip install requests

Looking in indexes: https://pypi.org/simple
Collecting requests
  Using cached 
  https://files.pythonhosted.org/packages/7d/e3/
  20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/
  requests-2.21.0-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached https://files.pythonhosted.org/packages/bc/a9/
  01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/
  chardet-3.0.4-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests)
  Using cached https://files.pythonhosted.org/packages/14/2c/
  cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/
  idna-2.8-py2.py3-none-any.whl
Collecting urllib3<1.25,>=1.21.1 (from requests)
  Using cached https://files.pythonhosted.org/packages/62/00/
  ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/
  urllib3-1.24.1-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached https://files.pythonhosted.org/packages/9f/e0/
  accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/
  certifi-2018.11.29-py2.py3-none-any.whl
Installing collected packages: chardet, idna, urllib3, certifi, requests
Successfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 
  requests-2.21.0 urllib3-1.24.1
You are using pip version 18.1, however version 19.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' 
  command.

Bạn sẽ thấy một đầu ra tương tự như ở trên. Bạn sử dụng pip với một lệnh install theo sau là tên của gói bạn muốn cài đặt. pip sẽ tìm kiếm gói trong PyPI, tính toán các phụ thuộc của nó và cài đặt chúng để đảm bảo requests sẽ hoạt động.

Bạn cũng có thể thấy rằng môi trường hiện tại đang sử dụng pip phiên bản 18.1, nhưng phiên bản 19.0.1 cũng đang có sẵn. Nó cũng hiển thị lệnh bạn nên sử dụng để cập nhật pip, vì vậy hãy làm điều đó:

$ python -m pip install --upgrade pip

Looking in indexes: https://pypi.org/simple
Collecting pip
  Downloading https://files.pythonhosted.org/packages/46/dc/
  7fd5df840efb3e56c8b4f768793a237ec4ee59891959d6a215d63f727023/
  pip-19.0.1-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 2.0MB/s
Installing collected packages: pip
  Found existing installation: pip 18.1
    Uninstalling pip-18.1:
      Successfully uninstalled pip-18.1
Successfully installed pip-19.0.1

Lưu ý rằng bạn sử dụng python -m để cập nhật pip-m yêu cầu Python chạy một mô-đun dưới dạng tệp thực thi. Điều này là cần thiết vì để bạn có thể cập nhật pip, phiên bản cũ phải được gỡ cài đặt trước khi cài đặt phiên bản mới và việc gỡ bỏ nó trong khi chạy công cụ có thể gây ra lỗi.

Khi bạn chạy pip dưới dạng mô-đun, Python sẽ tải mô-đun trong bộ nhớ và cho phép loại bỏ gói trong khi nó đang được sử dụng. Bạn có thể chạy các gói như thể chúng là các tập lệnh nếu gói đó cung cấp một tập lệnh cấp cao nhất __main__.py.

Bây giờ bạn đã cài đặt requests và nâng cấp pip, bạn có thể sử dụng lệnh list để xem các gói được cài đặt trong môi trường của bạn:

$ pip list

Package    Version
---------- ----------
certifi    2018.11.29
chardet    3.0.4
idna       2.8
pip        19.0.1
requests   2.21.0
setuptools 40.6.2
urllib3    1.24.1

Như bạn có thể thấy, pip đã được nâng cấp lên phiên bản 19.0.1 (phiên bản mới nhất tại thời điểm hiện tại) và requests phiên bản 2.21.0 đã được cài đặt.

Lệnh pip install <package> luôn luôn tìm kiếm những phiên bản mới nhất của gói và cài đặt nó. Nó cũng tìm kiếm các phần phụ thuộc được liệt kê trong siêu dữ liệu gói và cài đặt các phần phụ thuộc đó để đảm bảo rằng gói có tất cả các yêu cầu mà nó cần.

Như bạn có thể thấy, nhiều gói đã được cài đặt. Bạn có thể xem siêu dữ liệu gói bằng cách sử dụng lệnh show trong pip:

$ pip show requests

Name: requests
Version: 2.21.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: py37\lib\site-packages
Requires: certifi, chardet, idna, urllib3
Required-by:

Danh mục siêu dữ liệu certifichardetidna, và urllib3 là các phụ thuộc, và bạn có thể thấy chúng cũng đã được cài đặt.

Với gói requests được cài đặt, bạn có thể sửa đổi ví dụ trên và xem việc truy xuất nội dung của trang web dễ dàng như thế nào:

# In using-requests.py

import requests

url = 'https://www.google.com'
response = requests.get(url)
print(f'Response returned: {response.status_code}, {response.reason}')
print(response.text)

Bạn có thể import gói requests dưới dạng bất kỳ gói tiêu chuẩn nào khác vì nó hiện đã được cài đặt trong môi trường của bạn.

Như bạn có thể thấy, requests.get() xử lý kết nối HTTP cho bạn và trả về một đối tượng phản hồi tương tự như ví dụ ban đầu nhưng với một số cải tiến về giao diện.

Bạn không phải xử lý mã hóa của trang vì requests sẽ xử lý điều đó cho bạn trong hầu hết các tình huống. Tuy nhiên, requests cung cấp một giao diện linh hoạt để xử lý các trường hợp đặc biệt thông qua đối tượng requests.Response.

Sử dụng các tệp yêu cầu

Lệnh pip install luôn cài đặt các phiên bản đã xuất bản mới nhất của một gói, nhưng đôi khi, bạn có thể muốn cài đặt một phiên bản cụ thể mà bạn biết để làm việc với mã của bạn.

Bạn muốn tạo đặc điểm kỹ thuật của các phụ thuộc và phiên bản bạn đã sử dụng để phát triển và thử nghiệm ứng dụng của mình, vì vậy không có gì ngạc nhiên khi bạn sử dụng ứng dụng trong môi trường production.

Các tệp yêu cầu cho phép bạn chỉ định chính xác gói và phiên bản nào nên được cài đặt. Việc chạy pip help cho thấy rằng có một lệnh freeze xuất ra các gói đã cài đặt ở định dạng yêu cầu. Bạn có thể sử dụng lệnh này, chuyển hướng đầu ra đến tệp để tạo tệp yêu cầu:

$ pip freeze > requirements.txt
$ cat requirements.txt

certifi==2018.11.29
chardet==3.0.4
idna==2.8
requests==2.21.0
urllib3==1.24.1

Lệnh freeze sẽ bỏ tất cả các gói và các phiên bản của chúng để có đầu ra tiêu chuẩn, vì vậy bạn có thể chuyển hướng đầu ra vào một tập tin có thể được dùng để cài đặt các yêu cầu chính xác vào một hệ thống khác. Ta quy ước đặt tên cho tệp này là requirements.txt, nhưng bạn có thể đặt cho nó bất kỳ tên nào bạn muốn.

Khi bạn muốn sao chép môi trường trong một hệ thống khác, bạn có thể chạy pip install để chỉ định tệp yêu cầu bằng cách sử dụng -r:

$ pip install -r requirements.txt

Looking in indexes: https://pypi.org/simple
Collecting certifi==2018.11.29 (from -r .\requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/9f/e0/
  accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/
  certifi-2018.11.29-py2.py3-none-any.whl
Collecting chardet==3.0.4 (from -r .\requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/bc/a9/
  01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/
  chardet-3.0.4-py2.py3-none-any.whl
Collecting idna==2.8 (from -r .\requirements.txt (line 3))
  Using cached https://files.pythonhosted.org/packages/14/2c/
  cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/
  idna-2.8-py2.py3-none-any.whl
Collecting requests==2.21.0 (from -r .\requirements.txt (line 4))
  Using cached https://files.pythonhosted.org/packages/7d/e3/
  20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/
  requests-2.21.0-py2.py3-none-any.whl
Collecting urllib3==1.24.1 (from -r .\requirements.txt (line 5))
  Using cached https://files.pythonhosted.org/packages/62/00/
  ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/
  urllib3-1.24.1-py2.py3-none-any.whl
Installing collected packages: certifi, chardet, idna, urllib3, requests
Successfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 
  requests-2.21.0 urllib3-1.24.1

Các phiên bản của gói sẽ khớp với những phiên bản được liệt kê trong requirements.txt:

$ pip list

Package    Version
---------- ----------
certifi    2018.11.29
chardet    3.0.4
idna       2.8
pip        19.0.1
requests   2.21.0
setuptools 40.6.2
urllib3    1.24.1

Bạn có thể gửi tệp requirements.txt vào kiểm soát nguồn và sử dụng tệp đó để tạo môi trường chính xác trong các máy khác.

Tinh chỉnh các yêu cầu

Mở tệp requirements.txt và thực hiện các thay đổi sau:

certifi>=2018.11.29
chardet>=3.0.4
idna>=2.8
requests>=2.21.0
urllib3>=1.24.1

Bạn có thể thay đổi toán tử logic thành >= để yêu cầu pip cài đặt phiên bản bằng hoặc lớn hơn bản đã được xuất bản. Khi bạn thiết lập một môi trường mới bằng cách sử dụng tệp requirments.txtpip sẽ tìm phiên bản mới nhất đáp ứng yêu cầu và cài đặt nó. Bạn có thể nâng cấp các gói trong tệp yêu cầu của mình bằng cách chạy lệnh install với --upgrade:

$ pip install --upgrade -r requirements.txt

Looking in indexes: https://pypi.org/simple
Requirement already up-to-date: certifi==2018.11.29 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 1)) (2018.11.29)
Requirement already up-to-date: chardet==3.0.4 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 2)) (3.0.4)
Requirement already up-to-date: idna==2.8 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 3)) (2.8)
Requirement already up-to-date: requests==2.21.0 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 4)) (2.21.0)
Requirement already up-to-date: urllib3==1.24.1 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 5)) (1.24.1)

Không có gì được nâng cấp bởi vì bạn có phiên bản mới nhất, nhưng nếu một phiên bản mới được xuất bản cho một gói được liệt kê, thì gói đó sẽ được nâng cấp.

Trong một thế giới lý tưởng, các phiên bản mới của gói sẽ tương thích ngược và sẽ không bao giờ có lỗi mới. Thật không may, các phiên bản mới có thể giới thiệu những thay đổi sẽ phá vỡ ứng dụng của bạn. Cú pháp tệp yêu cầu hỗ trợ thông số phiên bản bổ sung để tinh chỉnh các yêu cầu của bạn.

Giả sử rằng một phiên bản mới 3.0 của requests được xuất bản nhưng giới thiệu một thay đổi không tương thích làm hỏng ứng dụng của bạn. Bạn có thể sửa đổi tệp yêu cầu để ngăn việc cài đặt bản 3.0 hoặc cao hơn:

certifi>=2018.11.29
chardet>=3.0.4
idna>=2.8
requests>=2.21.0, <3.0
urllib3>=1.24.1

Việc thay đổi thông số phiên bản cho gói requests đảm bảo rằng bất kỳ phiên bản nào lớn hơn hoặc bằng 3.0 đều không được cài đặt. Tài liệu pip cung cấp tất cả các thông tin về định dạng yêu cầu tập tin, và bạn có thể tham khảo để tìm hiểu thêm về nó.

Các phụ thuộc của bản production và development

Không phải tất cả các gói mà bạn cài đặt trong quá trình phát triển các ứng dụng của mình sẽ là các gói phụ thuộc vào ứng dụng. Có nhiều gói được xuất bản lên PyPI là các công cụ hoặc thư viện phát triển mà bạn muốn tận dụng trong quá trình phát triển.

Ví dụ: bạn có thể muốn kiểm thử đơn vị ứng dụng của mình, vậy bạn cần một framework unit test. Framework phổ biến cho unit test là pytest. Bạn muốn cài đặt nó trong môi trường development nhưng bạn không muốn nó trong môi trường production vì nó không phụ thuộc vào ứng dụng.

Bạn tạo tệp yêu cầu thứ hai (requirements_dev.txt) để liệt kê các công cụ bổ sung để thiết lập môi trường production:

# In requirements_dev.txt
pytest>=4.2.0

Điều này yêu cầu bạn sử dụng pip để cài đặt cả hai tệp yêu cầu: requirements.txt và requirements_dev.txt. May mắn thay, pip cho phép bạn chỉ định các tham số bổ sung trong tệp yêu cầu. Bạn cũng có thể sửa đổi requirements_dev.txt để cài đặt các yêu cầu từ tệp production requirements.txt:

# In requirements_dev.txt
-r requirements.txt
pytest>=4.2.0

Lưu ý rằng bạn đang sử dụng cùng một -r để cài đặt tệp production requirements.txt. Các định dạng tập tin yêu cầu cho phép bạn chỉ định đối số bổ sung phải vào một tập tin yêu cầu.

Đóng băng các yêu cầu đối với bản production

Bạn đã tạo các tệp yêu cầu cho bản production và development và thêm chúng vào kiểm soát nguồn. Các tệp sử dụng các chỉ định phiên bản linh hoạt để đảm bảo rằng bạn tận dụng các bản sửa lỗi được xuất bản bởi các phần phụ thuộc của bạn. Bạn cũng đang thử nghiệm ứng dụng của mình và sẵn sàng triển khai nó vào thực tế.

Bạn có thể muốn đảm bảo rằng các phiên bản của các phụ thuộc bạn triển khai cho sản xuất là phiên bản chính xác mà bạn đã sử dụng trong quy trình tích hợp hoặc quy trình xây dựng của mình vì bạn biết tất cả các thử nghiệm đều vượt qua và ứng dụng hoạt động.

Các chỉ định phiên bản hiện tại không đảm bảo rằng các phiên bản tương tự sẽ được triển khai cho phiên bản production, vì vậy bạn muốn đóng băng các yêu cầu production như đã thấy trước đó.

Bạn tạo một môi trường ảo production sạch và cài đặt các yêu cầu sản xuất bằng cách sử dụng file requirements.txt. Sau khi các yêu cầu được cài đặt, bạn có thể đóng băng các phiên bản cụ thể, kết xuất đầu ra vào một file requirements_lock.txt mà bạn sử dụng trong bản production. File requirements_lock.txt sẽ chứa các đặc tả phiên bản chính xác và có thể được sử dụng để tái tạo môi trường.

Tìm các gói để sử dụng

Khi bạn đã có kinh nghiệm hơn với Python thì bạn sẽ có một tập hợp các gói mà bạn sẽ biết và bạn sẽ sử dụng trong hầu hết các ứng dụng của mình. Các gói requests và pytest là những ứng cử viên sáng giá để trở thành công cụ hữu ích trong hộp công cụ Python của bạn.

Mặc dù vậy, sẽ có lúc bạn cần giải quyết một vấn đề khác và bạn sẽ muốn tìm kiếm một công cụ hoặc thư viện khác có thể giúp bạn giải quyết vấn đề đó. Như bạn có thể thấy ở trên, pip help cho thấy rằng có một lệnh search tìm kiếm các gói được xuất bản lên PyPI.

Hãy xem lệnh này có thể giúp chúng ta như thế nào:

$ pip help search

Usage:
  pip search [options] <query>

Description:
  Search for PyPI packages whose name or summary contains <query>.

Search Options:
  -i, --index <url>           Base URL of Python Package Index 
                              (default https://pypi.org/pypi)

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment 
                              variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be 
                              used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be 
                              used up to 3 times (corresponding to WARNING, 
                              ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form 
                              [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should 
                              attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: 
                              (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).
  --trusted-host <hostname>   Mark this host as trusted, even though it does 
                              not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file 
                              containing the private key and the certificate in 
                              PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine 
                              whether a new version of pip is available for 
                              download. Implied with --no-index.
  --no-color                  Suppress colored output

Lệnh có một tập hợp các tùy chọn được liệt kê ở trên và a <query>. Truy vấn chỉ là một chuỗi để tìm kiếm và sẽ khớp với các gói và mô tả của chúng.

Lưu ý: Bạn có thể sử dụng pip help <command> để truy xuất thông tin bổ sung về lệnh được hỗ trợ.

Giả sử ứng dụng của bạn cần truy cập vào một dịch vụ đang sử dụng OAuth2 để được cấp quyền. Lý tưởng nhất là có một thư viện hoạt động với requests hoặc với giao diện tương tự có thể giúp chúng ta. Lúc này ta làm như sau:

$ pip search requests oauth

requests-oauth (0.4.1)             - Hook for adding Open Authentication 
                                     support to Python-requests HTTP library.
oauth (1.0.1)                      - Library for OAuth version 1.0a.
pmr2.oauth (0.6.1)                 - OAuth PAS Plugin, OAuth 1.0 provider for 
                                     Plone.
oauth-proxy (1.0.5)                - OAuth HTTP proxy
django-oauth (1.1)                 - Support of OAuth in Django.
intuit-oauth (1.2.0)               - Intuit OAuth Client
brubeck-oauth (0.1.11)             - Brubeck OAuth module
guillotina-oauth (2.0.0)           - guillotina oauth support
httpie-oauth (1.0.2)               - OAuth plugin for HTTPie.
paytm-oauth (0.2)                  - Consumer for paytm oauth
plurk-oauth (0.9.2)                - Plurk OAuth API
oauth-flow (1.0.3)                 - Authenticate and make calls to OAuth 1.0, 
                                     OAuth 2.0 services
... Additional Output Omitted

Cụm từ tìm kiếm mang lại một bộ sưu tập các gói khá phong phú. Một số trong số chúng có vẻ cụ thể cho một dịch vụ hoặc công nghệ như django-oauthrequests-oauth. Tuy nhiên lại không có nhiều thông tin ngoài một mô tả ngắn gọn.

Hầu hết thời gian, bạn muốn tìm kiếm các gói trực tiếp trong trang web PyPI. PyPI cung cấp khả năng tìm kiếm cho chỉ mục của nó và cách lọc kết quả theo siêu dữ liệu được hiển thị trong gói, như framework, topic, development status, v.v.

Tìm kiếm các cụm từ giống nhau trong PyPI mang lại nhiều kết quả, nhưng bạn có thể lọc chúng theo các danh mục khác nhau. Ví dụ: bạn có thể mở rộng Intended Audience và chọn Developers vì bạn muốn có một thư viện giúp bạn phát triển ứng dụng của mình. Ngoài ra, bạn có thể muốn một gói ổn định và production-ready. Bạn có thể mở rộng danh mục Development Status và chọn Production/Stable:

Kết quả tìm kiếm trên PyPi cho Yêu cầu OAuth

Bạn có thể áp dụng các bộ lọc bổ sung và điều chỉnh các cụm từ tìm kiếm cho đến khi bạn tìm thấy gói mà bạn đang tìm kiếm.

Kết quả cung cấp một liên kết đến trang gói, trang này chứa nhiều thông tin hơn và hy vọng là một số tài liệu. Hãy cùng xem thông tin về requests-oauth2:

Trang gói PyPi cho các yêu cầu OAuth 2

Trang dự án cung cấp thêm thông tin, và nó dường như có một liên kết đến trang chủ của dự án. Liên kết đưa bạn đến kho dự án trên GitHub. Ở đó, bạn có thể xem thêm một số thông tin về dự án và một số ví dụ sử dụng.

Việc tìm kiếm kho mã nguồn ban đầu có thể là một nguồn tài nguyên vô giá. Ở đó, bạn có thể tìm thấy một số gợi ý về trạng thái của dự án bằng cách xem ngày của các commit mới nhất, số lượng các pull request và các vấn đề mở, v.v.

Một tùy chọn khác để tìm một gói là sử dụng trang tìm kiếm Google. Các thư viện Python được sử dụng rộng rãi sẽ hiển thị ở đầu các tìm kiếm của google và bạn sẽ có thể tìm thấy liên kết đến gói trong PyPI hoặc kho mã nguồn của nó.

Việc tìm kiếm gói phù hợp có thể mất một chút thời gian và nghiên cứu, nhưng nó cũng sẽ đẩy nhanh quá trình phát triển của bạn khi bạn tìm thấy nó.

Gỡ cài đặt gói

Đôi khi, bạn sẽ phải gỡ cài đặt một gói nào đó. Bạn đã tìm thấy một thư viện tốt hơn để thay thế nó, hoặc nó là thứ bạn không thực sự cần. Gỡ cài đặt các gói có thể hơi phức tạp.

Lưu ý rằng khi bạn cài đặt requests, thì pip cũng cài đặt các phụ thuộc khác. Bạn cài đặt càng nhiều gói, cơ hội có nhiều gói phụ thuộc vào cùng một phụ thuộc càng lớn. Đây là lúc bạn cần đến lệnh show của pip.

Trước khi bạn gỡ cài đặt một gói thì bạn nên chạy lệnh show cho gói đó:

$ pip show requests

Name: requests
Version: 2.21.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: c:\users\isaac\projects\virtualenv\py37\lib\site-packages
Requires: urllib3, certifi, chardet, idna
Required-by:

Lưu ý hai trường cuối cùng Requires và Required-by. Lệnh show cho ta biết requests yêu cầu urllib3certifichardet, và idna. Điều này có nghĩa bạn có thể xóa các phần này. Bạn cũng có thể thấy rằng requests không bị ràng buộc yêu cầu (Required-by) bởi bất kỳ gói nào khác, vì vậy có thể an toàn để gỡ cài đặt nó.

Bạn nên chạy lệnh show ngược lại với các phụ thuộc requests để đảm bảo rằng không có thư viện nào khác cũng phụ thuộc vào chúng. Khi bạn hiểu thứ tự phụ thuộc của các gói bạn muốn gỡ cài đặt, bạn có thể gỡ bỏ chúng bằng lệnh uninstall:

$ pip uninstall certifi

Uninstalling certifi-2018.11.29:
  Would remove:
    \py37\lib\site-packages\certifi-2018.11.29.dist-info\*
    \py37\lib\site-packages\certifi\*
Proceed (y/n)? y
  Successfully uninstalled certifi-2018.11.29

Gỡ cài đặt một gói sẽ hiển thị cho bạn các tệp sẽ bị xóa và sẽ yêu cầu xác nhận. Nếu bạn chắc chắn muốn xóa gói vì bạn đã kiểm tra các phần phụ thuộc của nó và biết rằng không có gì khác đang sử dụng nó, bạn có thể truyền -y để loại bỏ danh sách tệp và xác nhận:

$ pip uninstall urllib3 -y

Uninstalling urllib3-1.24.1:
  Successfully uninstalled urllib3-1.24.1

$ pip uninstall chardet -y

Uninstalling chardet-3.0.4:
  Successfully uninstalled chardet-3.0.4

$ pip uninstall idna -y

Uninstalling idna-2.8:
  Successfully uninstalled idna-2.8

$ pip uninstall requests -y

Uninstalling requests-2.21.0:
  Successfully uninstalled requests-2.21.0

Bạn có thể chỉ định tất cả các gói mà bạn muốn gỡ bỏ cài đặt trong một lời gọi duy nhất: pip uninstall -y urllib3 chardet idna requests.

Bạn cũng có thể gỡ cài đặt tất cả các gói được liệt kê trong tệp yêu cầu bằng cách cung cấp tùy chọn -r <requirments file>. Lệnh sẽ yêu cầu xác nhận cho từng gói riêng lẻ, nhưng bạn có thể chặn nó, nếu bạn biết mình đang làm gì, bằng cách sử dụng -y:

$ pip uninstall -r requirements.txt -y

Uninstalling certifi-2018.11.29:
  Successfully uninstalled certifi-2018.11.29
Uninstalling chardet-3.0.4:
  Successfully uninstalled chardet-3.0.4
Uninstalling idna-2.8:
  Successfully uninstalled idna-2.8
Uninstalling requests-2.21.0:
  Successfully uninstalled requests-2.21.0
Uninstalling urllib3-1.24.1:
  Successfully uninstalled urllib3-1.24.1

Hãy nhớ luôn kiểm tra các gói phụ thuộc mà bạn muốn gỡ cài đặt. Bạn có thể muốn gỡ cài đặt tất cả các phần phụ thuộc của nó, nhưng gỡ cài đặt một gói đang được người khác sử dụng sẽ phá vỡ ứng dụng của bạn.

Các lựa chọn thay thế cho pip

pip là một công cụ cần thiết cho Python, và nó được nhiều ứng dụng và dự án sử dụng để quản lý gói. Hướng dẫn này đã giúp bạn những điều cơ bản, nhưng cộng đồng Python rất tích cực trong việc cung cấp các công cụ và thư viện tuyệt vời cho các nhà phát triển khác sử dụng. Chúng bao gồm các lựa chọn thay thế khác để pip cố gắng đơn giản hóa và cải thiện việc quản lý gói.

Trong phần này, bạn sẽ tìm hiểu về các công cụ quản lý gói khác có sẵn cho Python.

Conda

Conda là một trình quản lý gói, phụ thuộc và môi trường cho nhiều ngôn ngữ bao gồm cả Python. Trên thực tế, nguồn gốc của nó đến từ Anaconda, khởi đầu là một gói khoa học dữ liệu cho Python.

Conda được sử dụng rộng rãi cho các ứng dụng khoa học dữ liệu và máy học, đồng thời sử dụng chỉ mục riêng của mình để lưu trữ các gói tương thích.

Conda không chỉ cho phép bạn quản lý các gói phụ thuộc mà còn quản lý môi trường ảo cho các ứng dụng của bạn, cài đặt các bản phân phối Python tương thích và đóng gói ứng dụng của bạn để triển khai bản production.

Thiết lập Python cho Máy học trên Windows là phần giới thiệu tuyệt vời về Conda khám phá quản lý gói và môi trường. Thông tin duy nhất về Windows cụ thể là về cài đặt, vì vậy nó vẫn có liên quan nếu bạn sử dụng nền tảng hệ điều hành khác.

Pipenv

Pipenv là một công cụ quản lý gói khác “nhằm mục đích mang lại những gì tốt nhất cho tất cả các thế giới đóng gói” cho Python. Nó thu hút được nhiều sự chú ý trong cộng đồng Python vì nó hợp nhất môi trường ảo và quản lý gói trong một công cụ duy nhất.

Nó cũng giải quyết một số trục trặc phổ biến nhất mà bạn sẽ gặp phải khi quản lý thủ công các phụ thuộc thông qua pip, như các phiên bản của gói, tách biệt các phụ thuộc phát triển và sản xuất cũng như khóa các phiên bản cho các bản production.

Pipenv: Hướng dẫn về Công cụ đóng gói Python mới là một khởi đầu tuyệt vời để tìm hiểu về Pipenv và cách tiếp cận của nó để quản lý gói.

Poetry

Poetry đang được rất nhiều người quan tâm. Giống như Pipenv, nó đơn giản hóa việc quản lý phiên bản gói và tách biệt các phần phụ thuộc development và production, và nó hoạt động bằng cách cô lập các phần phụ thuộc đó vào một môi trường ảo.

Nếu bạn biết về JavaScript và npm, thì bạn sẽ thấy Poetry khá quen thuộc. Nó vượt ra ngoài quản lý gói, giúp bạn xây dựng các bản phân phối cho các ứng dụng và thư viện của mình và triển khai chúng lên PyPI. Cách xuất bản Gói Python nguồn mở lên PyPI có phần giới thiệu hay về Poetry và có thể giúp bạn bắt đầu dễ dàng.

Kết luận: pip là gì?

Hướng dẫn này đã trả lời câu hỏi, pip là gì? Bạn đã thấy pip là một trình quản lý gói cho Python, được nhiều dự án sử dụng để quản lý các phần phụ thuộc. Nó được tích hợp trong quá trình cài đặt Python, làm cho nó trở thành một công cụ cần thiết cho mọi người sử dụng.

Python cung cấp một thư viện tiêu chuẩn mở rộng phù hợp để phát triển tất cả các loại ứng dụng, nhưng cộng đồng Python đang hoạt động cung cấp một bộ công cụ và thư viện lớn hơn nữa để tăng tốc độ phát triển ứng dụng Python.

Các công cụ và thư viện này được xuất bản lên Chỉ mục gói Python (PyPI) và pip cho phép các nhà phát triển cài đặt chúng trong môi trường ứng dụng của họ.

Trong hướng dẫn này, bạn đã học về:

  • Cài đặt các gói mới bằng lệnh pip và với các tệp yêu cầu
  • Quản lý các phụ thuộc, tách biệt các yêu cầu development và production, đồng thời tạo tệp yêu cầu đã bị khóa
  • Tìm các gói thông qua pip và PyPI
  • Đánh giá sự phụ thuộc của gói trước khi gỡ cài đặt gói và cách pip gỡ cài đặt gói

Ngoài ra, bạn đã học về tầm quan trọng của việc cập nhật các phần phụ thuộc và các lựa chọn thay thế pip có thể giúp bạn quản lý các phần phụ thuộc đó.

Vui lòng liên hệ trong phần nhận xét bên dưới nếu bạn có bất kỳ câu hỏi nào và bạn luôn có thể nhận thêm thông tin tại trang tài liệu pip.

» Tiếp: Python AI: Cách xây dựng mạng Nơ-ron thần kinh và đưa ra dự đoán
« Trước: Orchid: Buổi học số 5
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!