Mối quan hệ giữa virtualenv và pyenv là gì?


175

Gần đây tôi đã học cách sử dụng virtualenv và virtualenvwrapper trong quy trình làm việc của mình nhưng tôi đã thấy pyenv được đề cập trong một vài hướng dẫn nhưng dường như tôi không thể hiểu được pyenv là gì và nó khác / giống với virtualenv như thế nào. Pyenv là sự thay thế tốt hơn / mới hơn cho virtualenv hay một công cụ miễn phí? Nếu cái sau thì nó làm gì khác đi và làm thế nào để hai cái (và virtualenvwrapper nếu có) hoạt động cùng nhau?


3
fgimian.github.io/blog/2014/04/20/ trên : Tuy nhiên, có một cách khác gọi là pyenv có một số lợi thế đáng kể .
Martijn Pieters

11
Đừng như tôi và bị pyenvnhầm lẫn vớipyvenv
Người dùng

Câu trả lời:


162

Pyenvvirtualenv là những công cụ rất khác nhau hoạt động theo những cách khác nhau để làm những việc khác nhau:

  • Pyenv là một tiện ích mở rộng bash - sẽ không hoạt động trên Windows - chặn các cuộc gọi của bạn tới python, pip, v.v., để chuyển chúng đến một trong một số chuỗi công cụ python của hệ thống. Vì vậy, bạn luôn có sẵn tất cả các thư viện mà bạn đã cài đặt trong phiên bản python đã chọn - vì vậy nó tốt cho người dùng phải chuyển đổi giữa các phiên bản khác nhau của python.

  • VirtualEnv , là python thuần nên hoạt động ở mọi nơi, nó tạo một bản sao, tùy ý là một phiên bản cụ thể của python và pip cục bộ vào môi trường kích hoạt có thể bao gồm hoặc không bao gồm các liên kết đến chuỗi công cụ hệ thống hiện tại, nếu không bạn có thể chỉ cài đặt một tập hợp con các thư viện đã biết vào môi trường đó. Vì vậy, gần như chắc chắn sẽ tốt hơn nhiều cho việc thử nghiệm và triển khai vì bạn biết chính xác thư viện nào, ở phiên bản nào, được sử dụng và thay đổi toàn cầu sẽ không ảnh hưởng đến mô-đun của bạn.

trăn venv > 3,3

Lưu ý rằng từ Python 3.3 trở đi, có một triển khai VirtualEnv được gọi là venv (với, trên một số cài đặt, trình bao bọc có tên pyvenv - trình bao bọc này không được dùng trong Python 3.6 ), có lẽ nên được sử dụng theo sở thích. Để tránh các sự cố có thể xảy ra với trình bao bọc, thường là một ý tưởng tốt để sử dụng trực tiếp bằng cách sử dụng /path/to/python3 -m venv desired/env/pathhoặc bạn có thể sử dụng pybộ chọn python tuyệt vời trên windows với py -3 -m venv desired/env/path. Nó sẽ tạo thư mục được chỉ định với desired/env/pathcấu hình và điền nó một cách thích hợp. Nói chung, nó rất giống như sử dụng VirtualEnv.

Công cụ bổ sung

Có một số công cụ đáng được đề cập và xem xét, vì chúng có thể giúp sử dụng một hoặc nhiều trong số các công cụ trên:

  • VirtualEnvWrapper Quản lý và đơn giản hóa việc sử dụng và quản lý VirtualEnv - Nền tảng chéo .
  • pyenv-virtualenv , được cài đặt bởi trình cài đặt pyenv , cung cấp các công cụ PyEnv để quản lý và giao tiếp với VirtualEnv - với điều này, bạn có thể có một bản cài đặt cơ bản bao gồm nhiều hơn một phiên bản python và tạo các môi trường biệt lập trong mỗi chúng - Linux / OS- X . Được đề xuất bởi Johann Visagie
  • PyInstaller có thể lấy mã python của bạn, có thể được phát triển và thử nghiệm trong VirtualEnv và đóng gói để nó có thể chạy một nền tảng không cài đặt phiên bản python của bạn - Lưu ý rằng đó không phải là trình biên dịch chéo bạn sẽ cần Windows (ảo -) máy để xây dựng các bản cài đặt Windows, v.v., nhưng nó có thể tiện dụng ngay cả khi bạn có thể chắc chắn rằng python sẽ được cài đặt nhưng không thể chắc chắn rằng phiên bản của python và tất cả các thư viện sẽ tương thích với mã của bạn.

3
Có lẽ đáng nói đến pyenv-virtualenv, một plugin pyenv cho phép pyenv và virtualenv hoạt động trơn tru trong cùng một lúc. Nếu bạn đã cài đặt pyenv bằng trình cài đặt pyenv, pyenv-virtualenv sẽ có mặt. * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv

1
Thế còn venv, trong thư viện tiêu chuẩn?
Flimm

@Flimm: Từ python 3.3 trở đi venv là một phần của thư viện chuẩn và nên được sử dụng thay vì virtualenv vì nó thường được mô tả là "virtualenv được thực hiện đúng" - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Steve Barnes

2
pyenv-virtualenv không chỉ (hoặc ít nhất là không còn) linux. Có một gói homebrew cho nó để cài đặt dễ dàng trên MacOS.
Biến

Cảm ơn bạn đã làm nổi bật khả năng tương tác!
HashRocketSyntax

16

virtualenvcho phép bạn tạo một bản cài đặt Python tùy chỉnh, ví dụ như trong thư mục con của dự án. Do đó, mỗi dự án của bạn có thể có riêng python(hoặc thậm chí một số) theo virtualenv tương ứng. Hoàn toàn ổn khi một số / tất cả các virtualen thậm chí có cùng một phiên bản python(ví dụ 2.7.16) mà không có xung đột - chúng sống riêng và không biết về nhau. Nếu bạn muốn sử dụng bất kỳ tệp nào trong số đó python, bạn phải sử dụng activatenó (bằng cách chạy một tập lệnh sẽ tạm thời sửa đổi của bạn PATHđể đảm bảo rằng bin/thư mục của virtualenv xuất hiện trước). Từ thời điểm đó, việc gọi python(hoặc pipv.v.) sẽ gọi phiên bản của virtualenv cho đến khi bạn deactivate(nó khôi phục lại PATH).

pyenvhoạt động ở quy mô rộng hơn virtualenv- nó chứa một thanh ghi các cài đặt Python (và có thể được sử dụng để cài đặt các cài đặt mới) và cho phép bạn định cấu hình phiên bản Python nào sẽ chạy khi bạn sử dụng pythonlệnh. Âm thanh tương tự nhưng sử dụng thực tế là một chút khác nhau. Nó hoạt động bằng cách thêm trước pythontập lệnh shim của nó vào PATH(vĩnh viễn) và sau đó quyết định gọi "thực" pythonnào. Bạn thậm chí có thể cấu hình pyenv để gọi vào một trong những pythons virtualenv của bạn (bằng cách sử dụng pyenv-virtualenvplugin). Các phiên bản Python bạn cài đặt bằng cách sử dụng pyenvđi vào $(pyenv root)/versions/thư mục của nó (theo mặc định, gốc pyenv là ~ / .pyenv) vì vậy 'toàn cầu' hơn virtualenv. Thông thường, bạn không thể sao chép các phiên bản Python được cài đặt qua pyenv, ít nhất làm như vậy không phải là ý chính.

Để tạo một virtualenv với một phiên bản Python cụ thể, bạn cần phải có phiên bản đó ở đâu đó trong hệ thống của bạn (dù là trên PATHhay không) và về cơ bản sao chép nó vào virtualenv mới tạo của bạn. Tất nhiên, một cách để có được một phiên bản cụ thể là cài đặt nó qua pyenv. Khi đã xong, các virtualenv riêng lẻ có thể tự do phân kỳ bằng cách cài đặt các mô-đun (hoặc phiên bản khác nhau) vào chúng.

Nói ngắn gọn:

  • virtualenv cho phép bạn tạo các cài đặt python độc lập, cục bộ bằng cách nhân bản từ những cái hiện có
  • pyenv cho phép bạn cài đặt các phiên bản khác nhau của python đồng thời (toàn hệ thống hoặc chỉ dành cho người dùng cục bộ) và sau đó chọn vô số trăn để chạy bất cứ lúc nào (bao gồm cả các phiên bản được tạo bởi virtualenv hoặc Anaconda)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.