12. Môi trường và gói ảo¶
12.1. Giới thiệu¶
Các ứng dụng Python thường sử dụng các gói và mô-đun không có trong thư viện chuẩn. Các ứng dụng đôi khi sẽ cần một phiên bản cụ thể của thư viện, vì ứng dụng có thể yêu cầu một lỗi cụ thể đã được sửa hoặc ứng dụng có thể được viết bằng phiên bản giao diện của thư viện đã lỗi thời.
Điều này có nghĩa là một bản cài đặt Python có thể không đáp ứng được yêu cầu của mọi ứng dụng. Nếu ứng dụng A cần phiên bản 1.0 của một mô-đun cụ thể nhưng ứng dụng B cần phiên bản 2.0 thì các yêu cầu sẽ xung đột và việc cài đặt phiên bản 1.0 hoặc 2.0 sẽ khiến một ứng dụng không thể chạy được.
Giải pháp cho vấn đề này là tạo một virtual environment, một cây thư mục độc lập chứa bản cài đặt Python cho một phiên bản Python cụ thể, cùng với một số gói bổ sung.
Các ứng dụng khác nhau sau đó có thể sử dụng các môi trường ảo khác nhau. Để giải quyết ví dụ trước về xung đột yêu cầu, ứng dụng A có thể có môi trường ảo riêng được cài đặt phiên bản 1.0 trong khi ứng dụng B có môi trường ảo khác với phiên bản 2.0. Nếu ứng dụng B yêu cầu nâng cấp thư viện lên phiên bản 3.0, điều này sẽ không ảnh hưởng đến môi trường của ứng dụng A.
12.2. Tạo môi trường ảo¶
Mô-đun được sử dụng để tạo và quản lý môi trường ảo được gọi là venv. venv sẽ cài đặt phiên bản Python mà lệnh đã được chạy (như được báo cáo bởi tùy chọn --version). Ví dụ: thực thi lệnh bằng python3.12 sẽ cài đặt phiên bản 3.12.
Để tạo môi trường ảo, hãy quyết định thư mục mà bạn muốn đặt nó và chạy mô-đun venv dưới dạng tập lệnh với đường dẫn thư mục:
python -m venv hướng dẫn-env
Thao tác này sẽ tạo thư mục tutorial-env nếu nó không tồn tại, đồng thời tạo các thư mục bên trong chứa bản sao của trình thông dịch Python và các tệp hỗ trợ khác nhau.
Vị trí thư mục chung cho môi trường ảo là .venv. Tên này giữ cho thư mục thường bị ẩn trong shell của bạn và do đó không thể sử dụng được trong khi đặt cho nó một cái tên giải thích lý do tại sao thư mục đó tồn tại. Nó cũng ngăn xung đột với các tệp định nghĩa biến môi trường .env mà một số công cụ hỗ trợ.
Khi bạn đã tạo một môi trường ảo, bạn có thể kích hoạt nó.
Trên Windows, hãy chạy:
hướng dẫn-env\Scripts\kích hoạt
Trên Unix hoặc MacOS, hãy chạy:
nguồn hướng dẫn-env/bin/kích hoạt
(Tập lệnh này được viết cho bash shell. Nếu bạn sử dụng shell csh hoặc fish, thì bạn nên sử dụng các tập lệnh activate.csh và activate.fish thay thế.)
Kích hoạt môi trường ảo sẽ thay đổi lời nhắc của shell để hiển thị môi trường ảo bạn đang sử dụng và sửa đổi môi trường để việc chạy python sẽ mang đến cho bạn phiên bản và bản cài đặt Python cụ thể đó. Ví dụ:
$ nguồn ~/envs/tutorial-env/bin/activate
(hướng dẫn-env) $ python
Python 3.5.1 (mặc định, ngày 6 tháng 5 năm 2016, 10:59:36)
...
>>> nhập hệ thống
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
Để hủy kích hoạt môi trường ảo, hãy nhập:
vô hiệu hóa
vào thiết bị đầu cuối.
12.3. Quản lý gói bằng pip¶
Bạn có thể cài đặt, nâng cấp và xóa các gói bằng chương trình có tên pip. Theo mặc định, pip sẽ cài đặt các gói từ Python Package Index. Bạn có thể duyệt Chỉ mục gói Python bằng cách truy cập nó trong trình duyệt web của bạn.
pip có một số lệnh phụ: "cài đặt", "gỡ cài đặt", "đóng băng", v.v. (Tham khảo hướng dẫn Cài đặt mô-đun Python để có tài liệu đầy đủ về pip.)
Bạn có thể cài đặt phiên bản mới nhất của gói bằng cách chỉ định tên gói:
(tutorial-env) $ python -m pip cài đặt novas
Thu thập nova
Đang tải xuống nova-3.1.1.3.tar.gz (136kB)
Cài đặt các gói đã thu thập: novas
Chạy setup.py cài đặt cho nova
Đã cài đặt thành công nova-3.1.1.3
Bạn cũng có thể cài đặt một phiên bản cụ thể của gói bằng cách đặt tên gói theo sau là == và số phiên bản:
(tutorial-env) $ python -m pip yêu cầu cài đặt==2.6.0
Đang thu thập yêu cầu==2.6.0
Sử dụng các yêu cầu được lưu trong bộ nhớ cache-2.6.0-py2.py3-none-any.whl
Cài đặt các gói đã thu thập: yêu cầu
Đã cài đặt thành công request-2.6.0
Nếu bạn chạy lại lệnh này, pip sẽ thông báo rằng phiên bản được yêu cầu đã được cài đặt và không làm gì cả. Bạn có thể cung cấp số phiên bản khác để có phiên bản đó hoặc bạn có thể chạy python -m pip install --upgrade để nâng cấp gói lên phiên bản mới nhất:
(tutorial-env) $ python -m pip cài đặt --yêu cầu nâng cấp
Thu thập yêu cầu
Cài đặt các gói đã thu thập: yêu cầu
Đã tìm thấy cài đặt hiện có: yêu cầu 2.6.0
Gỡ cài đặt request-2.6.0:
Đã gỡ cài đặt thành công request-2.6.0
Đã cài đặt thành công request-2.7.0
python -m pip uninstall theo sau là một hoặc nhiều tên gói sẽ xóa các gói đó khỏi môi trường ảo.
python -m pip show sẽ hiển thị thông tin về một gói cụ thể:
(tutorial-env) $ python -m pip hiển thị yêu cầu
---
Phiên bản siêu dữ liệu: 2.0
Tên: yêu cầu
Phiên bản: 2.7.0
Tóm tắt: Python HTTP dành cho Con người.
Trang chủ: http://python-requests.org
Tác giả: Kenneth Reitz
Email tác giả: me@kennethreitz.com
Giấy phép: Apache 2.0
Vị trí: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Yêu cầu:
python -m pip list sẽ hiển thị tất cả các gói được cài đặt trong môi trường ảo:
(tutorial-env) $ python -m danh sách pip
tân tinh (3.1.1.3)
khó chịu (1.9.2)
pip (7.0.3)
yêu cầu (2.7.0)
công cụ thiết lập (16.0)
python -m pip freeze sẽ tạo ra một danh sách tương tự các gói đã cài đặt, nhưng đầu ra sử dụng định dạng mà python -m pip install mong đợi. Một quy ước chung là đặt danh sách này vào tệp requirements.txt:
(tutorial-env) $ python -m pip đóng băng > require.txt
(tutorial-env) $ cat require.txt
nova==3.1.1.3
gọn gàng==1.9.2
yêu cầu==2.7.0
Sau đó, requirements.txt có thể được cam kết kiểm soát phiên bản và được vận chuyển như một phần của ứng dụng. Sau đó, người dùng có thể cài đặt tất cả các gói cần thiết với install -r:
(tutorial-env) $ python -m pip cài đặt -r require.txt
Thu thập novas==3.1.1.3 (từ -r request.txt (dòng 1))
...
Thu thập numpy==1.9.2 (từ -r request.txt (dòng 2))
...
Đang thu thập các yêu cầu==2.7.0 (từ -r request.txt (dòng 3))
...
Cài đặt các gói đã thu thập: novas, numpy, request
Chạy setup.py cài đặt cho nova
Đã cài đặt thành công novas-3.1.1.3 numpy-1.9.2 request-2.7.0
pip có nhiều lựa chọn hơn. Tham khảo hướng dẫn Cài đặt mô-đun Python để có tài liệu đầy đủ về pip. Khi bạn đã viết một gói và muốn cung cấp gói đó trên Chỉ mục gói Python, hãy tham khảo Python packaging user guide.