Liệu Conda có thay thế nhu cầu về virtualenv?


205

Gần đây tôi đã phát hiện ra Conda sau khi tôi gặp sự cố khi cài đặt SciPy, đặc biệt trên ứng dụng Heroku mà tôi đang phát triển.

Với Conda bạn tạo môi trường, rất giống với những gì virtualenv làm. Câu hỏi của tôi là:

  1. Nếu tôi sử dụng Conda, nó sẽ thay thế nhu cầu cho virtualenv? Nếu không, làm thế nào để tôi sử dụng hai cùng nhau? Tôi có cài đặt virtualenv trong Conda hay Conda trong virtualenv không?
  2. Tôi vẫn cần sử dụng pip chứ? Nếu vậy, tôi vẫn có thể cài đặt các gói với pip trong một môi trường bị cô lập chứ?

Nếu bạn quan tâm đến việc sử dụng conda và pip trên Heroku, hãy xem ví dụ github.com/faph/conda-pip-buildpack
faph

Cảm ơn. Tôi đã nhận thấy rằng có khá nhiều bản dựng conda cho Heroku trên github. Những yếu tố nào tôi nên tính đến khi quyết định sử dụng buildpack nào?
Kritz

Lưu ý rằng bạn vẫn sẽ cần sử dụng pip nếu bạn muốn cài đặt các gói không có sẵn trực tiếp từ máy chủ của Continuum.
ali_m

Vâng, tôi thấy rằng họ vẫn còn trên Django 1.8 (không phải 1.9). Hiện tại tôi sẽ sử dụng conda khi cần thiết (scipy và numpy) và pip cho mọi thứ khác - nhưng vẫn trong conda.
Kritz

Hầu hết các gói xây dựng Heroku có nguồn gốc từ một tác phẩm của Kenneth Reitz tôi nghĩ. Với những người tinh chỉnh chúng cho phù hợp với sở thích của họ. Chỉ cần kiểm tra xem chúng có bao gồm cả conda và hỗ trợ pip nếu đó là những gì bạn cần. Và nếu họ hỗ trợ tập tin môi trường.yml. Bạn luôn có thể nhanh chóng xem qua mã buildpack để xem bạn có thích tập lệnh xây dựng không, ví dụ để xem chính xác môi trường được tạo như thế nào.
faph

Câu trả lời:


157
  1. Conda thay thế virtualenv. Theo tôi thì tốt hơn. Nó không giới hạn ở Python nhưng cũng có thể được sử dụng cho các ngôn ngữ khác. Theo kinh nghiệm của tôi, nó cung cấp trải nghiệm mượt mà hơn nhiều, đặc biệt là cho các gói khoa học. Lần đầu tiên tôi cài đặt MayaVi đúng cách trên Mac là với conda.

  2. Bạn vẫn có thể sử dụng pip. Trong thực tế, condacài đặt piptrong mỗi môi trường mới. Nó biết về các gói cài đặt pip.

Ví dụ:

conda list

liệt kê tất cả các gói được cài đặt trong môi trường hiện tại của bạn. Các gói cài đặt Conda hiển thị như thế này:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

và những cái được cài đặt thông qua pip<pip>điểm đánh dấu:

wxpython-common           3.0.0.0                   <pip>

8
Có bất kỳ tiêu cực nào khi sử dụng pip trong môi trường Anaconda không? Đã bao giờ có trường hợp bạn muốn sử dụng pip mặc dù một gói có sẵn thông qua Conda?
clifgray

Sự khác biệt là gạch nối so với gạch dưới? Nếu tên gói không có thì sao? Làm sao để khác biệt?
Tom Hale

1
Dấu gạch dưới hoặc dấu gạch nối là một phần của tên gói. Điều này không có gì để làm với pip hoặc conda. Các <pip>chương trình cho thấy nó đã được cài đặt với pip nếu không nó được cài đặt với conda.
Mike Müller

4
Có một sự cảnh báo lớn với "conda biết về các gói cài đặt pip". Theo hiểu biết của tôi, bên trong một conda env, pip hoạt động độc lập, vì vậy conda không thể gỡ cài đặt các gói đã cài đặt pip chẳng hạn
information_interchange

1
@clifgray - Các gói pip và conda có thư viện dùng chung có thể cài đặt các phiên bản không tương thích nhị phân của các phiên bản sẽ bắt đầu gây ra tất cả các loại lỗi thế giới bản địa (sigsegv-s, v.v.) khó gỡ lỗi cho ai đó không theo kịp trình gỡ lỗi C. Tương tự đối với các gói chỉ dành cho python, chỉ là chúng rất dễ hiểu.
bobah

61

Câu trả lời ngắn gọn là, bạn chỉ cần conda.

  1. Conda kết hợp hiệu quả chức năng của pip và virtualenv trong một gói duy nhất, vì vậy bạn không cần virtualenv nếu bạn đang sử dụng conda.

  2. Bạn sẽ ngạc nhiên khi có bao nhiêu gói conda hỗ trợ. Nếu nó không đủ, bạn có thể sử dụng pip theo conda.

Đây là một liên kết đến trang conda so sánh conda, pip và virtualenv:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands .


34

Môi trường ảo và pip

Tôi sẽ thêm rằng việc tạoloại bỏ môi trường conda rất đơn giản với Anaconda.

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

Trong môi trường được kích hoạt , cài đặt các gói thông qua condahoặc pip:

(envname)> conda install <package>

(envname)> pip install <package>

Các môi trường này được liên kết chặt chẽ với quản lý gói giống như pip của conda , vì vậy thật đơn giản để tạo môi trường và cài đặt cả gói Python và không phải Python.


Jupyter

Ngoài ra, cài đặtipykernel trong môi trường sẽ thêm một danh sách mới trong menu thả xuống Kernels của sổ ghi chép Jupyter, mở rộng môi trường có thể tái tạo vào sổ ghi chép. Kể từ Anaconda 4.1, nbextensions đã được thêm vào , thêm phần mở rộng vào notebook dễ dàng hơn.

độ tin cậy

Theo kinh nghiệm của tôi, conda nhanh hơn và đáng tin cậy hơn trong việc cài đặt các thư viện lớn như numpypandas. Hơn nữa, nếu bạn muốn chuyển trạng thái được bảo tồn của một môi trường, bạn có thể làm như vậy bằng cách chia sẻ hoặc nhân bản một env.


18

Cài đặt Conda sẽ cho phép bạn tạo và xóa môi trường python theo ý muốn, do đó cung cấp cho bạn chức năng tương tự như virtualenv .

Trong trường hợp cả hai bản phân phối, bạn sẽ có thể tạo một cây hệ thống tập tin bị cô lập, nơi bạn có thể cài đặt và loại bỏ các gói python (có thể, với pip) như bạn muốn. Điều này có thể có ích nếu bạn muốn có các phiên bản khác nhau của cùng một thư viện cho các trường hợp sử dụng khác nhau hoặc bạn chỉ muốn thử một số phân phối và loại bỏ nó sau đó bảo tồn không gian đĩa của bạn.

Sự khác biệt:

Thỏa thuận cấp phép. Trong khi virtualenv thuộc hầu hết giấy phép MIT tự do , Conda sử dụng 3 giấy phép BSD.

Conda cung cấp cho bạn hệ thống kiểm soát gói riêng của họ. Hệ thống kiểm soát gói này thường cung cấp các phiên bản được biên dịch sẵn (đối với hầu hết các hệ thống phổ biến) của phần mềm không phải python phổ biến, có thể dễ dàng giúp một số gói học máy hoạt động. Cụ thể, bạn không phải biên dịch mã C / C ++ được tối ưu hóa cho hệ thống của mình. Mặc dù nó là một cứu trợ tuyệt vời cho hầu hết chúng ta, nó có thể ảnh hưởng đến hiệu suất của các thư viện như vậy.

Không giống như virtualenv, Conda sao chép một số thư viện hệ thống ít nhất là trên hệ thống Linux. Thư viện này có thể không đồng bộ dẫn đến hành vi không nhất quán của các chương trình của bạn.

Bản án:

Conda là tuyệt vời và nên là lựa chọn mặc định của bạn trong khi bắt đầu con đường của bạn với máy học. Nó sẽ giúp bạn tiết kiệm thời gian lộn xộn với gcc và nhiều gói. Tuy nhiên, Conda không thay thế virtualenv. Nó giới thiệu một số phức tạp bổ sung mà có thể không phải luôn luôn mong muốn. Nó đi theo giấy phép khác nhau. Bạn có thể muốn tránh sử dụng conda trên môi trường phân tán hoặc trên phần cứng HPC.


2
hãy suy nghĩ thêm một chút về lý do tại sao "bạn có thể muốn tránh sử dụng conda trên môi trường phân tán hoặc trên phần cứng HPC"? @ y.selivonchyk
Oliver Hu

1
Tôi không đồng ý với một số kết luận này. "Hành vi chương trình không nhất quán" là kết quả của việc không cấu hình đúng chương trình của bạn để sử dụng condaphần mềm và thư viện đã cài đặt. Và trong HPC, condatốt hơn là trong nhiều trường hợp, trên thực tế, nó đang được Quản trị viên HPC sử dụng để thay thế những thứ như modulehệ thống. Nó cho phép người dùng cài đặt phần mềm và cách ly phần mềm lớn hơn, hai vấn đề lớn trên HPC. Sự cảnh báo duy nhất tôi trải nghiệm là nhiều hệ thống tệp HPC có giới hạn cứng về số lượng tệp trong một thư mục và conda tạo ra nhiều tệp 1.000.
dùng5359531

9

Tôi sử dụng cả hai và (kể từ tháng 1 năm 2020) họ có một số khác biệt bề ngoài cho vay đối với các cách sử dụng khác nhau đối với tôi. Theo mặc định, Conda thích quản lý danh sách các môi trường cho bạn ở một vị trí trung tâm, trong khi virtualenv tạo một thư mục trong thư mục hiện tại. Cái trước (tập trung) có ý nghĩa nếu bạn đang học máy và chỉ có một vài môi trường rộng lớn mà bạn sử dụng trong nhiều dự án và muốn nhảy vào chúng từ bất cứ đâu. Cái sau (trên mỗi thư mục dự án) có ý nghĩa nếu bạn đang thực hiện các dự án nhỏ một lần có các yêu cầu lib hoàn toàn khác nhau thực sự thuộc về chính dự án.

Môi trường trống mà Conda tạo ra là khoảng 122 MB trong khi virtualenv là khoảng 12 MB, vì vậy đó là một lý do khác khiến bạn không muốn phân tán môi trường Conda ở khắp mọi nơi.

Cuối cùng, một dấu hiệu bề ngoài khác cho thấy Conda thích các env tập trung của nó là (một lần nữa, theo mặc định) nếu bạn tạo một Conda env trong thư mục dự án của riêng bạn và kích hoạt nó tiền tố tên xuất hiện trong vỏ của bạn là (cách quá dài) đường dẫn đến thư mục. Bạn có thể khắc phục điều đó bằng cách đặt tên cho nó, nhưng virtualenv thực hiện đúng theo mặc định.

Tôi hy vọng thông tin này sẽ trở nên cũ kỹ nhanh chóng khi hai nhà quản lý gói tranh giành quyền thống trị, nhưng đây là những sự đánh đổi cho đến ngày hôm nay :)


Lời giải thích hay! Bạn có một số khó khăn khi sử dụng cả hai? Bạn đã bao giờ sử dụng pipenv?
Mikhail_Sam

8

Một tùy chọn mới khác và phương pháp ưa thích hiện tại của tôi để có được một môi trường và chạy là Pipenv

Nó hiện là công cụ đóng gói Python chính thức được đề xuất từ ​​Python.org


1
Điều này đã nhắc "eh? What pipenv?", Điều này dẫn tôi đến reddit.com/r/Python/comments/8jd6aq/ và và sedimental.org/the_packaging_gradient.html . Tôi vẫn không biết nên dùng gì nhưng ít nhất tôi cũng được thông tin tốt hơn. Tôi nghĩ.
matt wilkie

Sau khi xem phần giới thiệu và nhanh chóng đọc phần giới thiệu, pipenv dường như không thể quản lý các phiên bản Python ...
Carles Alcolea

@CarlesAlcolea pipenv cũng có thể chỉ định các phiên bản khác nhau bằng cách: pipenv --twocho Python2 và pipenv --three cho python3
Kurian Benoy

3

Vâng, condadễ cài đặt hơn virtualenvrất nhiều, và thay thế khá nhiều cái sau.


6
Tại sao Anaconda cung cấp hướng dẫn để cài đặt một môi trường ảo nếu nó thay thế chúng?
jmh

1
@jmh Anaconda không thay thế môi trường ảo, nó thay thế công cụ quản lý môi trường ảo dành riêng cho Python bằng virtualenvcông cụ quản lý môi trường ảo tổng quát hơn conda. Ngoài ra, Anaconda chỉ là một bản phân phối Python + bao gồm công cụ Conda; câu hỏi (và câu trả lời) chỉ về Conda.
merv

3
Câu trả lời này không thêm bất cứ điều gì ngoài câu trả lời đã có từ nhiều năm trước nó.
merv

1

Tôi làm việc trong công ty, đằng sau một số tường lửa với máy mà tôi không có quản trị viên

Theo kinh nghiệm hạn chế của tôi với python (2 năm), tôi đã bắt gặp một vài thư viện (JayDeBeApi, sasl) mà khi cài đặt qua pip đã gây ra lỗi phụ thuộc C ++: bắt buộc phải có Microsoft Visual C ++ 14.0. Nhận nó với "Công cụ xây dựng Microsoft Visual C ++": http://landinghub.visualstudio.com/visual-cpp-build-tools

Chúng được cài đặt tốt với conda, vì vậy kể từ những ngày đó tôi bắt đầu làm việc với conda env. tuy nhiên không dễ để ngăn conda cài đặt phụ thuộc bên trong c.programfiles nơi tôi không có quyền ghi.

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.