Sự khác biệt giữa venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, v.v?


1025

Python 3.3 bao gồm trong thư viện tiêu chuẩn của nó gói mới venv. Nó làm gì và nó khác với tất cả các gói khác có vẻ khớp với regex (py)?(v|virtual|pip)?envnhư thế nào?


20
Và để giành được số phiếu gần, tôi cảm thấy đây là một câu hỏi chung chung hơn stackoverflow.com/questions/29950300/ , và vì vậy tôi không cảm thấy thoải mái khi chỉnh sửa câu hỏi đó hoặc đăng câu trả lời quá chung chung trên bài đăng đó.
Flimm

12
Hướng dẫn này vừa hữu ích & được cập nhật liên tục vì python tiếp tục bổ sung thêm & nhiều hơn "một và chỉ một cách rõ ràng" để thực hiện: docs.python-guide.org/en/latest/dev/virtualenvs
michael

2
Kể từ 3.6, tôi thấy việc virtualenv hoạt động dễ dàng hơn so với pyenv trên macOS (Tôi là pyNoob)
HashRocketSyntax

@HashRocketSyntax virtualenvpyenvkhông thực hiện cùng chức năng và không phải là lựa chọn thay thế cho nhau. Xem câu trả lời của tôi.
Flimm

7
Tôi đã đốt cháy cả ngày lãng phí thời gian với pipenv. Điểm mấu chốt, nó quá mức. Venv và virtualenv nếu bạn cần py2 là những công cụ thích hợp. Conda (miniconda nếu bạn không cần stack đầy đủ) cũng rất tốt. Viết rất tốt: chriswarrick.com/blog/2018/07/17/ Khăn
BơiBikeRun

Câu trả lời:


1383

Các gói PyPI không có trong thư viện chuẩn:

  • virtualenvlà một công cụ rất phổ biến tạo ra các môi trường Python bị cô lập cho các thư viện Python. Nếu bạn không quen thuộc với công cụ này, tôi khuyên bạn nên tìm hiểu nó, vì nó là một công cụ rất hữu ích và tôi sẽ so sánh với phần còn lại của câu trả lời này.

    Nó hoạt động bằng cách cài đặt một loạt các tệp trong một thư mục (ví dụ env/:), sau đó sửa đổi PATHbiến môi trường thành tiền tố với một binthư mục tùy chỉnh (ví dụ env/bin/:). Một bản sao chính xác của pythonhoặc python3nhị phân được đặt trong thư mục này, nhưng Python được lập trình để tìm các thư viện liên quan đến đường dẫn của nó trước, trong thư mục môi trường. Nó không phải là một phần của thư viện tiêu chuẩn của Python, nhưng được PyPA (Cơ quan đóng gói Python) chính thức ban phước. Sau khi kích hoạt, bạn có thể cài đặt các gói trong môi trường ảo bằng cách sử dụng pip.

  • pyenvđược sử dụng để cô lập các phiên bản Python. Ví dụ: bạn có thể muốn kiểm tra mã của mình với Python 2.7, 3.6, 3.7 và 3.8, vì vậy bạn sẽ cần một cách để chuyển đổi giữa chúng. Sau khi được kích hoạt, nó có tiền tố PATHbiến môi trường ~/.pyenv/shims, trong đó có các tệp đặc biệt khớp với các lệnh Python ( python, pip). Đây không phải là bản sao của các lệnh do Python vận chuyển; chúng là các tập lệnh đặc biệt quyết định việc chạy phiên bản Python nào dựa trên PYENV_VERSIONbiến môi trường hoặc .python-versiontệp hoặc ~/.pyenv/versiontệp. pyenvcũng làm cho quá trình tải xuống và cài đặt nhiều phiên bản Python dễ dàng hơn bằng cách sử dụng lệnh pyenv install.

  • pyenv-virtualenvlà một plugin cho pyenvcùng một tác giả pyenv, để cho phép bạn sử dụng pyenvvirtualenvđồng thời thuận tiện. Tuy nhiên, nếu bạn đang sử dụng Python 3.3 trở lên, pyenv-virtualenvsẽ cố chạy python -m venvnếu có sẵn, thay vì virtualenv. Bạn có thể sử dụng virtualenvpyenvcùng nhau mà không cần pyenv-virtualenv, nếu bạn không muốn các tính năng tiện lợi.

  • virtualenvwrapperlà một bộ các phần mở rộng để virtualenv(xem tài liệu ). Nó cung cấp cho bạn các lệnh như mkvirtualenv, lssitepackagesvà đặc biệt là workonđể chuyển đổi giữa khác nhau virtualenvthư mục. Công cụ này đặc biệt hữu ích nếu bạn muốn nhiều virtualenvthư mục.

  • pyenv-virtualenvwrapperlà một plugin cho pyenvcùng một tác giả pyenv, để tích hợp thuận tiện virtualenvwrappervào pyenv.

  • pipenvnhằm mục đích kết hợp Pipfile, pipvirtualenvvào một lệnh trên dòng lệnh. Thư mục virtualenvthường được đặt trong ~/.local/share/virtualenvs/XXX, với XXXhàm băm của đường dẫn của thư mục dự án. Điều này khác với virtualenv, nơi thư mục thường nằm trong thư mục làm việc hiện tại. pipenvđược dùng để phát triển các ứng dụng Python (trái ngược với các thư viện). Có những lựa chọn thay thế pipenv, như poetry, mà tôi sẽ không liệt kê ở đây vì câu hỏi này chỉ là về các gói được đặt tên tương tự.

Thư viện chuẩn:

  • pyvenvlà một tập lệnh được vận chuyển bằng Python 3 nhưng không được dùng trong Python 3.6 vì nó có vấn đề (không đề cập đến tên khó hiểu). Trong Python 3.6+, tương đương chính xác là python3 -m venv.

  • venvlà một gói được vận chuyển bằng Python 3, mà bạn có thể chạy bằng cách sử dụng python3 -m venv(mặc dù vì một số lý do, một số bản phân tách tách nó thành một gói phân phối riêng, chẳng hạn như python3-venvtrên Ubuntu / Debian). Nó phục vụ cùng một mục đích như virtualenv, nhưng chỉ có một tập hợp con các tính năng của nó ( xem một so sánh ở đây ). virtualenvtiếp tục phổ biến hơn venv, đặc biệt là vì trước đây hỗ trợ cả Python 2 và 3.

Khuyến nghị cho người mới bắt đầu:

Đây là đề xuất cá nhân của tôi cho người mới bắt đầu: bắt đầu bằng cách học virtualenvpip, các công cụ hoạt động với cả Python 2 và 3 và trong nhiều tình huống khác nhau và chọn các công cụ khác khi bạn bắt đầu cần chúng.


115
Điều này rất hữu ích! Vậy tại sao có 8 thứ rối thay vì 1? (Nên có một - và tốt nhất là chỉ có một - cách rõ ràng để làm điều đó. Hãy - Zen của Python)
Jerry101

59
@ Jerry101, việc giới thiệu venv là một phần để đáp ứng với mớ hỗn độn đó. Nếu bạn muốn giúp cải thiện tình hình, tôi khuyên bạn nên sử dụng venv và khuyến khích người khác làm điều tương tự.
Magnus Lind Oxlund

31
"Việc giới thiệu venv một phần là phản ứng với mớ hỗn độn đó" Làm thế nào khi có quá nhiều thứ làm "cái gì đó giống như X", mọi người luôn nghĩ rằng họ có thể cải thiện mớ hỗn độn đó bằng cách tạo ra một thứ khác giống như "thứ gì đó giống như X" . Đó là loại buồn cười thực sự. Chúng tôi bây giờ là 4 năm sau ... vì vậy có thể thích hợp để hỏi, đã venvthực sự giải quyết vấn đề đó?
Kris

34
Hai công cụ duy nhất trong danh sách thực sự bao gồm những gì được cho là cùng lãnh thổ là virtualenv và venv, do đó, đặc điểm mà chúng ta đang xử lý một mớ hỗn độn gây ra bởi một số công cụ cạnh tranh là không chính xác. Tuy nhiên, danh sách này bao gồm một số công cụ liên quan đến môi trường ảo, tất cả đều có tên nghe giống nhau. Điều đó có thể gây nhầm lẫn, đặc biệt là với người dùng chỉ đang tìm hiểu về chúng. Đã venv cải thiện tình hình? Nó đã cung cấp một sự thay thế nhẹ hơn cho các công cụ môi trường ảo khác, được hưởng lợi từ các sửa đổi gốc và một vị trí trong thư viện tiêu chuẩn. ...
Magnus Lind Oxlund

11
@cowbert Sau khi chỉ cần nâng cấp từ Python 3.5 lên Python 3.6 và tất cả các virtualenv của tôi bị hỏng, có vẻ như venvcho phép bạn nâng cấp lên phiên bản Python mới dễ dàng hơn.
Daniel H

276

Tôi sẽ chỉ tránh sử dụng virtualenvsau Python3.3 + và thay vào đó sử dụng thư viện vận chuyển tiêu chuẩn venv. Để tạo một môi trường ảo mới, bạn sẽ gõ:

$ python3 -m venv <MYVENV>  

virtualenvcố gắng sao chép nhị phân Python vào thư mục bin của môi trường ảo. Tuy nhiên, nó không cập nhật các liên kết tệp thư viện được nhúng vào nhị phân đó, vì vậy nếu bạn xây dựng Python từ nguồn vào một thư mục không có hệ thống với các tên đường dẫn tương đối, thì nhị phân Python bị phá vỡ. Vì đây là cách bạn tạo một bản sao phân phối Python, nó là một lỗ hổng lớn. BTW để kiểm tra các liên kết tệp thư viện nhúng trên OS X, sử dụng otool. Ví dụ từ trong môi trường ảo của bạn, gõ:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Do đó, tôi sẽ tránh virtualenvwrapperpipenv. pyvenvbị phản đối pyenvdường như được sử dụng thường xuyên ở những nơi virtualenvđược sử dụng nhưng tôi cũng sẽ tránh xa nó vì tôi nghĩ venvcũng làm những gì pyenvđược xây dựng cho.

venvtạo các môi trường ảo trong hệ vỏ mới và được hộp cát , với các thư viện có thể cài đặt đượcngười dùng có thể sử dụng nhiều python . Mới mẻ vì môi trường ảo chỉ bắt đầu với các thư viện tiêu chuẩn đi kèm với python, bạn phải cài đặt lại bất kỳ thư viện nào khác pip installtrong khi môi trường ảo đang hoạt động. Sandboxed vì không có cài đặt thư viện mới nào có thể nhìn thấy bên ngoài môi trường ảo, vì vậy bạn có thể xóa toàn bộ môi trường và bắt đầu lại mà không lo ảnh hưởng đến cài đặt python cơ sở của bạn. Thư viện do người dùng cài đặt vì thư mục đích của môi trường ảo được tạo mà không cósudotrong một số thư mục bạn đã sở hữu, vì vậy bạn sẽ không cần sudoquyền để cài đặt thư viện vào đó. Cuối cùng, nó là an toàn cho nhiều python , vì khi môi trường ảo kích hoạt, shell chỉ nhìn thấy phiên bản python (3.4, 3.5, v.v.) được sử dụng để xây dựng môi trường ảo đó.

pyenvtương tự như venvở chỗ nó cho phép bạn quản lý nhiều môi trường python. Tuy nhiên, với việc pyenvbạn không thể tiện lợi cài đặt thư viện rollback vào một số trạng thái bắt đầu và bạn có thể sẽ cần adminđặc quyền tại một số điểm để cập nhật thư viện. Vì vậy, tôi nghĩ rằng nó cũng là tốt nhất để sử dụng venv.

Trong vài năm qua, tôi đã tìm thấy nhiều vấn đề trong các hệ thống xây dựng (gói emacs, trình xây dựng ứng dụng độc lập python, trình cài đặt ...) mà cuối cùng lại gặp vấn đề virtualenv. Tôi nghĩ python sẽ là một nền tảng tốt hơn khi chúng tôi loại bỏ tùy chọn bổ sung này và chỉ sử dụng venv.


3
add2virtualenvđiều chỉnh của bạn PYTHONPATHbằng cách thêm một _virtualenv_path_extensions.pthtập tin tùy chỉnh dưới site-packages. Ngoài ra, bạn có thể cập nhật PYTHONPATHbiến môi trường trong bin/activatetệp mà bạn gọi mỗi khi bạn kích hoạt môi trường ảo. Hoặc bạn có thể thêm symlink bên dưới site-packagesđể trỏ đến các thư mục bổ sung. Cả hai lựa chọn thay thế này đều minh bạch hơn đối với các nhà phát triển công cụ dòng lệnh truyền thống sử dụng rộng rãi để khắc phục sự cố. Việc sử dụng một tùy chỉnh .pthvới một tên không có giấy tờ, làm cho nó có vẻ huyền diệu hơn IMO.
Riaz Rizvi

15
Được rồi vì vậy tôi đã xác nhận trên stackoverflow.com/questions/48130371/ , đó là một bản cập nhật chính xác để đáp PYTHONPATHứng nhu cầu add2virtualenv. Liên quan đến việc thiếu trợ giúp về SO từ bình luận đầu tiên của bạn, đề nghị duy nhất của tôi là upvote câu trả lời nếu họ khắc phục vấn đề của bạn, để thúc đẩy mọi người khắc phục sự cố cho bạn khi bạn đăng bài? Một nửa giờ điều tra + viết lên để đổi lấy một cú click chuột? Nghe có vẻ là một giao dịch tốt ...
Riaz Rizvi

7
Không, bạn đã đúng - Tôi cố gắng trở nên tốt về nâng cấp. Heck, nếu bạn ở trong khu vực của tôi, tôi sẽ mua cho bạn một ly bia. Tôi sẽ giữ đúng lời hứa của mình và xem liệu các tài liệu python sẽ cho phép tôi thêm thay đổi vào / bin / kích hoạt các tài liệu chính thức cho rõ ràng. Mặc dù tôi không tuyệt vời, nhưng tôi không ghê gớm với trăn. Nếu điều đó thật khó khăn với tôi ... Dù sao đi nữa, cảm ơn bạn đã dành thời gian - chúc bạn những điều tốt đẹp nhất.
SteveJ

9
@ MalikA.Rumi, phước lành đã được giảm xuống một chút để "người sáng tạo Pipenv siêng năng tiếp thị cho chúng tôi và những người khác, đó là lý do tại sao chúng tôi đề cập đến Pipenv".
Rob Grant

6
@AndreaMoro Đó pyvenvlà sự phản đối, không phải pyenv. Thật dễ dàng để bị nhầm lẫn với tên của các công cụ này.
Daniel Holmes

25

Tôi đã đi xuống pipenvhố thỏ (thực sự là một hố sâu và tối ... ) và vì câu trả lời cuối cùng đã hơn 2 năm trước , cảm thấy thật hữu ích khi cập nhật cuộc thảo luận với những phát triển mới nhất về chủ đề phong bì ảo Python I Đã tìm thấy.

TUYÊN BỐ TỪ CHỐI:

Câu trả lời này KHÔNG phải là về việc tiếp tục cuộc tranh luận dữ dội về giá trị của pipenv so với venv như các giải pháp phong bì - Tôi không xác nhận một trong hai . Đó là về PyPA tán thành các tiêu chuẩn mâu thuẫn và cách phát triển tương lai của virtualenv hứa hẹn sẽ phủ nhận việc đưa ra một hoặc / hoặc sự lựa chọn giữa chúng. Tôi tập trung vào hai công cụ này một cách chính xác bởi vì chúng là những công cụ được PyPA xức dầu .

venv

Như OP lưu ý, venv là một công cụ để ảo hóa môi trường. KHÔNG phải là giải pháp của bên thứ ba, mà là công cụ gốc. PyPA tán thành venv để tạo VIRTUAL ENVELOPES : " Đã thay đổi trong phiên bản 3.5: Việc sử dụng venv hiện được khuyến nghị để tạo môi trường ảo ".

pipenv

pipenv - giống như venv - có thể được sử dụng để tạo phong bì ảo nhưng ngoài ra còn cóchức năngquản lý gói và kiểm tra lỗ hổng . Thay vì sử dụngrequirements.txt,pipenvcung cấp quản lý gói thông qua Pipfile . Vì PyPA tán thành pipenv cho QUẢN LÝ GÓI , điều đó dường như ngụ ýpipfilelà thay thếrequirements.txt.

TUY NHIÊN : pipenv sử dụng virtualenv như công cụ của nó để tạo ra phong bì ảo, KHÔNG venv được xác nhận bởi PyPA như đường đi đến công cụ để tạo phong bì ảo.

Tiêu chuẩn xung đột:

Vì vậy, nếu việc giải quyết một giải pháp phong bì ảo không đủ khó, giờ đây chúng ta có PyPA chứng thực hai công cụ khác nhau sử dụng các giải pháp phong bì ảo khác nhau. Cuộc tranh luận Github hoành hành trên venv vs virtualenv làm nổi bật cuộc xung đột này có thể được tìm thấy ở đây .

Giải quyết xung đột:

Cuộc tranh luận Github được tham chiếu trong liên kết ở trên đã thúc đẩy sự phát triển virtualenv theo hướng hỗ trợ venv trong các phiên bản tương lai :

thích venv tích hợp: nếu python mục tiêu có venv, chúng tôi sẽ tạo môi trường bằng cách sử dụng nó (và sau đó thực hiện các hoạt động tiếp theo trên đó để tạo điều kiện cho các đảm bảo khác mà chúng tôi cung cấp)

Phần kết luận:

Vì vậy, có vẻ như sẽ có một số sự hội tụ trong tương lai giữa hai giải pháp phong bì ảo đối thủ, nhưng cho đến bây giờ pipenv - sử dụng virtualenv- thay đổi về mặt vật chất venv.

Với những vấn đề mà pipenv giải quyết và thực tế là PyPA đã ban phước, nó dường như có một tương lai tươi sáng. Và nếu virtualenv cung cấp các mục tiêu phát triển được đề xuất của mình, việc chọn giải pháp phong bì ảo sẽ không còn là trường hợp của pipenv HOẶC venv .


6
Từ những gì tôi đã hiểu: giá trị thực tế của pipenv đã được tranh luận trong một thời gian và nó đã không được phát hành trong hơn một năm. Nhiều thứ đã thay đổi kể từ đó, và tôi sẽ lập luận rằng nó chỉ trở nên tồi tệ hơn đối với pipenv (các công cụ như thơ cacông cụ pip có hình dạng tốt hơn nhiều). Các trang PyPA đã lỗi thời và tôi cho rằng họ nên hạ cấp pipenv . venv là một công cụ tiêu chuẩn và như vậy là rất hiệu quả nhưng có một bộ tính năng hạn chế. virtualenv không cạnh tranh với venv nhưng cố gắng bao phủ những khu vực mà venv không thể hoặc không muốn đi (vì đó là một tiêu chuẩn).
sinoroc

@sinoroc bài của tôi là không phải về những giá trị hoặc pipenv., Đó là về sự chỉ đạo mâu thuẫn của PyPA ủng hộ cả hai pipenv venv làm cho sự lựa chọn của một giải pháp phong bì khó khăn hơn và làm thế nào nó xuất hiện ở một mức độ hội tụ sẽ phủ nhận sự cần thiết phải chọn giữa họ cả. Lưu ý rằng tôi không xác nhận bất cứ điều gì, chỉ chia sẻ những gì tôi đã tìm hiểu về cách hai giải pháp được chứng thực bởi PyPA đang phát triển. Với sự quan tâm PyPA trong họ, cho dù tôi giống như họ hay không trở nên không thích hợp: pipenv và venv dường như có khả năng để trở thành một phần của cảnh quan
F1Linux

9
Tôi sẽ nói dính vào venvpip càng nhiều càng tốt. Hai đang ở đây để nghỉ, venv là một phần của thư viện chuẩn của Python và theo một nghĩa pip cũng kể từ khi nó vendored bằng Python (thông qua ensurepip ). Các công cụ khác ( loạt pyenv sang một bên: hoàn toàn khác) dường như dựa vào hoặc mô phỏng (với ít nhiều thành công) venvpip . Đó là tuyệt vời. Nhưng nếu mọi thứ trở nên tồi tệ , venvpip là dự phòng an toàn. Công cụ khác duy nhất tôi sử dụng là độc tố (với tox-venv) để giúp tạo và tạo ra các môi trường ảo (đơn giản, không có phép thuật, lạ là nó chưa được đề cập).
sinoroc

3
Bài đăng mới nhất này là vàng vì nó đã làm rất tốt trong việc ủi ra các nếp nhăn. Tôi đang gắn bó với pip và venv vì tôi gặp vấn đề với các nhị phân lơ lửng khi sử dụng virtualenv khi hệ thống python được nâng cấp.
codeviper

1
trong quá khứ tôi gặp vấn đề với pipenv nonverbose về lỗi. argl và mương. Ngoài ra: chriswarrick.com/blog/2018/07/17/ Mạnh
qrtLs

4

Cập nhật tháng 4 năm 2020

Tôi đã tìm kiếm tương tự khi tôi đi qua bài viết này . Tôi nghĩ vấn đề này sử dụng công cụ nào là khá khó hiểu và khó khăn cho những người dùng Python mới như tôi. Đây là trực tiếp từ trang web PyPA liên quan đến pipenv:

Mặc dù hướng dẫn này trình bày dự án pipenv như một công cụ tập trung chủ yếu vào nhu cầu phát triển ứng dụng Python thay vì phát triển thư viện Python, bản thân dự án hiện đang xử lý một số vấn đề về quy trình và bảo trì nhằm ngăn chặn sửa lỗi và các tính năng mới được xuất bản ( với toàn bộ năm 2019 trôi qua mà không có bản phát hành mới). Điều này có nghĩa là trong thời gian tới, pipenv vẫn gặp phải một số vấn đề về hiệu suất và hiệu suất mà không có mốc thời gian rõ ràng để giải quyết những điều đó.

Trong khi điều này vẫn còn, các nhà bảo trì dự án có thể muốn điều tra các Công cụ khác để quản lý phụ thuộc ứng dụng để sử dụng thay vì, hoặc cùng với, pipenv.

Giả sử bản phát hành pipenv tháng 4 năm 2020 đi trước như kế hoạch và bản phát hành sau đó vẫn đi đúng hướng, thì cảnh báo này trong hướng dẫn sẽ được gỡ bỏ. Nếu các bản phát hành đó không đi đúng hướng, thì bản thân hướng dẫn sẽ bị xóa và được thay thế bằng một trang thảo luận về các tùy chọn quản lý phụ thuộc có sẵn.


Có vẻ như pipenv hiện tại (tức là vào tháng 5 năm 2020) vẫn đang trong giai đoạn tiền phát hành cho phiên bản tháng 4 năm 2020. Xem ở đây .
andrewjames

Điều này không trả lời câu hỏi.
Flimm

Tôi nghĩ rằng @Flimm đã trả lời tốt các câu hỏi. Tôi đã trả lời câu trả lời của
F1Linux

1
Tính đến ngày 04 Tháng Sáu năm 2020, các pipenvnhóm nghiên cứu đã phát hành 2 phiên bản để PyPI: 2020.5.28và gần đây hơn, 2020.6.2: pypi.org/project/pipenv/#history
sự không có
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.