Bổ sung vào tháng 1 năm 2019: Nếu bạn quay lại blog này sau khi nâng cấp lên macOS Mojave, vui lòng xem vấn đề github này để biết giải pháp cho vấn đề ‘zlib không khả dụng’ phổ biến của pyenv.
Trước khi bắt đầu, chúng ta hãy xem qua các thuật ngữ được sử dụng trong tiêu đề:
- Nhiều phiên bản Python: Các bản cài đặt Python khác nhau trên cùng một máy, ví dụ 2.7 và 3.4.
- môi trường ảo: các môi trường độc lập biệt lập có thể có cả phiên bản Python cụ thể và bất kỳ gói dành riêng cho dự án nào được cài đặt bên trong chúng mà không ảnh hưởng đến bất kỳ dự án nào khác.
Ở đây chúng ta sẽ xem xét ba công cụ khác nhau để làm việc với những công cụ này và khi nào bạn có thể cần đến từng công cụ đó. Hãy khám phá các trường hợp sử dụng cho:
venv
/pyvenv
pyenv
pyenv-virtualenv
Nếu bạn đang sử dụng một phiên bản đơn của Python nói phiên bản 3.3+và muốn quản lý môi trường ảo khác nhau, sau đó venv
là tất cả những gì bạn cần.
Nếu bạn muốn sử dụng nhiều phiên bản của Python tại 3.3+, có hoặc không có môi trường ảosau đó tiếp tục đọc về pyenv
.
Nếu bạn cũng muốn làm việc với Trăn 2sau đó pyenv-virtualenv
là một công cụ để xem xét.
venv
Từ Python 3.3 trở lên venv
gói được bao gồm. Đó là lý tưởng để tạo môi trường ảo nhẹ.
Cho đến Python 3.6, một tập lệnh có tên pyvenv
cũng được bao gồm như một lớp bọc xung quanh venv
, nhưng điều này đã không được chấp nhận. Nó sẽ bị xóa hoàn toàn trong Python 3.8. Các chức năng chính xác tương tự có sẵn khi sử dụng venv
và mọi tài liệu hiện có phải được cập nhật. Đối với bất kỳ ai quan tâm, bạn có thể đọc lý do đằng sau việc khấu hao pyvenv
.
venv
được sử dụng để tạo một môi trường mới thông qua lệnh terminal:
$ python3 -m venv directory-name-to-create
kích hoạt với:
$ source name-given/bin/activate
và hủy kích hoạt chỉ bằng:
$ deactivate
Nếu bạn cần xóa hoàn toàn môi trường sau khi hủy kích hoạt nó, bạn có thể chạy:
$ rm -r name-given
Theo mặc định, môi trường mà nó tạo ra sẽ là phiên bản Python hiện tại mà bạn đang sử dụng. Nếu bạn đang viết tài liệu và muốn có thêm sự an toàn rằng phiên bản chính xác của Python đang được người đọc của bạn sử dụng, bạn có thể chỉ định số phiên bản chính và phụ trong lệnh, như sau:
$ python3.6 -m venv example-three-six
Nếu bạn đọc đang sử dụng phiên bản không phải 3.6 thì câu lệnh sẽ không thành công và sẽ báo trong thông báo lỗi của nó. Tuy nhiên, bất kỳ phiên bản vá lỗi nào (ví dụ 3.6.4) sẽ hoạt động.
Khi môi trường đang hoạt động, bất kỳ gói nào cũng có thể được cài đặt vào nó thông qua pip
như bình thường. Theo mặc định, môi trường mới được tạo sẽ không phải bao gồm bất kỳ gói nào đã được cài đặt trên máy. Như pip
bản thân nó sẽ không nhất thiết phải được cài đặt trên máy. Nên nâng cấp lần đầu pip
lên phiên bản mới nhất, sử dụng pip install --upgrade pip
.
Các dự án thường sẽ có một requirements.txt
tệp chỉ định các phụ thuộc của nó. Điều này cho phép lệnh tắt pip install -r requirements.txt
lệnh để nhanh chóng cài đặt tất cả các gói vào môi trường ảo mới được tạo. Chúng sẽ chỉ tồn tại trong môi trường ảo. Nó sẽ không khả dụng khi bị hủy kích hoạt nhưng sẽ tồn tại khi được kích hoạt lại.
Nếu bạn không cần sử dụng các phiên bản bổ sung của Python, thì đây là tất cả những gì bạn cần để tạo các môi trường ảo, riêng biệt, dành riêng cho dự án.
pyenv
Nếu bạn muốn sử dụng nhiều phiên bản Python trên một máy, thì pyenv
là một công cụ thường được sử dụng để cài đặt và chuyển đổi giữa các phiên bản. Điều này không bị nhầm lẫn với khấu hao đã đề cập trước đó pyvenv
kịch bản. Nó không đi kèm với Python và phải được cài đặt riêng.
Các pyenv
tài liệu bao gồm một mô tả tuyệt vời về cách thức hoạt động của nó, vì vậy ở đây chúng ta sẽ xem xét cách sử dụng nó một cách đơn giản.
Đầu tiên chúng ta sẽ cần cài đặt nó. Nếu sử dụng Mac OS X, chúng ta có thể thực hiện việc này bằng Homebrew, nếu không thì hãy xem xét các tùy chọn cài đặt khác.
$ brew update
$ brew install pyenv
Tiếp theo, thêm phần sau vào cuối tập lệnh shell của bạn để cho phép pyenv
để tự động thay đổi phiên bản cho bạn:
eval "$(pyenv init -)"
Để thực hiện, hãy mở tập lệnh Shell đang sử dụng của bạn, thông qua $ ~/.zshrc
, $ ~/.bashrc
hoặc $ ~/.bash_profile
và sao chép và dán dòng trên vào.
Đang chạy pyenv versions
sẽ hiển thị phiên bản Python nào hiện đang được cài đặt, với một *
bên cạnh cái hiện đang được sử dụng. pyenv version
cho thấy điều này trực tiếp, và python --version
có thể được sử dụng để xác minh điều này.
Để cài đặt một phiên bản bổ sung, nói 3.4.0
chỉ cần sử dụng pyenv install 3.4.0
.
pyenv
xem xét bốn vị trí để quyết định sử dụng phiên bản Python nào, theo thứ tự ưu tiên:
- Các
PYENV_VERSION
biến môi trường (nếu được chỉ định). Bạn có thể dùngpyenv shell
để đặt biến môi trường này trong phiên shell hiện tại của bạn. - ứng dụng cụ thể
.python-version
tập tin trong thư mục hiện tại (nếu có). Bạn có thể sửa đổi thư mục hiện tại.python-version
tập tin vớipyenv local
chỉ huy. - đầu tiên
.python-version
tệp được tìm thấy (nếu có) bằng cách tìm kiếm từng thư mục mẹ, cho đến khi đến thư mục gốc của hệ thống tệp của bạn. - Tệp phiên bản toàn cầu. Bạn có thể sửa đổi tập tin này bằng cách sử dụng
pyenv global
chỉ huy. Nếu không có tệp phiên bản toàn cầu, pyenv giả định rằng bạn muốn sử dụng Python “hệ thống”. (Nói cách khác, bất kỳ phiên bản nào sẽ chạy nếu pyenv không có trongPATH
.)
Khi thiết lập một dự án mới sử dụng Python 3.6.4 thì pyenv local 3.6.4
sẽ được chạy trong thư mục gốc của nó. Điều này sẽ thiết lập cả phiên bản và tạo một .python-version
tệp, để máy của những người đóng góp khác sẽ nhận tệp đó.
Mô tả đầy đủ về pyenv
lệnh là một để đánh dấu.
pyenv và venv
Khi làm việc với Python 3.3+, giờ đây chúng ta biết cả cách cài đặt và chuyển đổi giữa các phiên bản Python khác nhau cũng như cách tạo môi trường ảo mới.
Ví dụ: giả sử chúng tôi đang thiết lập một dự án sử dụng Python 3.4.
Trước tiên, chúng tôi có thể đặt phiên bản cục bộ của mình bằng cách sử dụng pyenv local 3.4.0
.
Nếu sau đó chúng tôi chạy python3 -m venv example-project
một môi trường ảo mới sẽ được thiết lập dưới example-project
sử dụng Python 3.4.0 được kích hoạt cục bộ của chúng tôi.
Chúng tôi kích hoạt bằng cách sử dụng source example-project/bin/activate
và có thể bắt đầu làm việc.
Tiếp theo chúng ta có thể tùy ý tài liệu mà một cộng tác viên nên sử dụng python3.4 -m venv <name>
. Điều này có nghĩa là ngay cả khi cộng tác viên không sử dụng pyenv thì python3.4
lệnh sẽ lỗi nếu phiên bản Python của chúng không giống phiên bản chính và phụ (3 và 4) như chúng tôi dự định.
Ngoài ra, chúng tôi có thể chọn chỉ định rằng 3.4.0 sẽ được sử dụng và hướng dẫn python3 -m venv <name>
. Nếu chúng tôi tin rằng bất kỳphiên bản greter hơn 3,4 là chấp nhận được, sau đó chúng tôi cũng có thể chọn sử dụng python3
trên python3.4
, vì nếu cộng tác viên đang sử dụng 3.6 thì họ cũng sẽ gặp lỗi. Đây là một quyết định cụ thể của dự án.
pyenv-virtualenv
pyenv
có thể được sử dụng để cài đặt cả phiên bản Python 2 và 3. Tuy nhiên, như chúng ta đã thấy, venv
được giới hạn ở các phiên bản Python lớn hơn 3.3.
pyenv-virtualenv
là công cụ tạo môi trường ảo tích hợp với pyenv
và hoạt động cho tất cả các phiên bản Python. Vẫn nên sử dụng Python chính thức venv
có thể ở đâu. Nhưng nếu, ví dụ, bạn đang tạo một môi trường ảo dựa trên 2.7.13
sau đó khen ngợi pyenv
.
Nó cũng hoạt động tốt với Anaconda và Miniconda conda
môi trường nếu bạn đã sử dụng chúng. Một công cụ gọi là virtualenv
cũng tồn tại. Nó không được đề cập ở đây, nhưng nó được liên kết ở cuối.
Sau khi cài đặt pyenv
tiếp theo nó có thể được cài đặt bằng Homebrew (hoặc các lựa chọn thay thế) như sau:
$ brew install pyenv-virtualenv
tiếp theo trong của bạn .zshrc
, .bashrc
hoặc .bash_profile
(tùy thuộc vào trình bao bạn sử dụng) thêm phần sau vào phía dưới:
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Điều này cho phép pyenv
để tự động kích hoạt và hủy kích hoạt môi trường khi di chuyển thư mục.
Để tạo một môi trường ảo mới, hãy sử dụng:
$ pyenv virtualenv <version> <name-to-give-it>
// for example
$ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
Các môi trường hiện có có thể được liệt kê với:
$ pyenv virtualenvs
Kích hoạt / hủy kích hoạt với:
$ pyenv activate <name>
$ pyenv deactivate
Tại thời điểm viết, khi sử dụng activate
cảnh báo prompt changing will be removed from future release
sẽ được hiển thị. Điều này được mong đợi và chỉ đề cập đến (env-name)
được hiển thị trong trình bao của bạn, không phải việc sử dụng activate
ra lệnh cho chính nó.
Yêu cầu cài đặt hoạt động như được mô tả trong venv
. không giống như trong venv
một rm -r
lệnh là không cần thiết để loại bỏ một môi trường, một uninstall
lệnh tồn tại.
suy nghĩ cuối cùng
Giữa ba công cụ này, chúng tôi có khả năng cộng tác trên bất kỳ dự án nào, bất kể phiên bản Python hay phụ thuộc được yêu cầu. Chúng tôi cũng biết cách lập tài liệu hướng dẫn thiết lập để người khác sử dụng cho bất kỳ dự án nào mà chúng tôi thực hiện.
Chúng ta cũng có thể thấy lý do đằng sau việc sử dụng bộ nào, vì không phải tất cả các nhà phát triển đều yêu cầu cả ba.
Hy vọng điều này hữu ích và là tài liệu tham khảo hữu ích khi kết hợp với tài liệu được liên kết bên dưới.
Cảm ơn vì đã đọc! ?