Làm cho virtualenv kế thừa các gói cụ thể từ các gói trang web toàn cầu của bạn


208

Tôi đang tìm cách tạo một virtualenv sẽ chỉ chứa một số thư viện (mà tôi đã chọn) của bản cài đặt python cơ sở.

Để cụ thể hơn, tôi đang cố gắng nhập matplotlib của mình vào virtualenv trong quá trình tạo virtualenv. Nó không thể được cài đặt hiệu quả với pip hoặc easy_install vì nó bỏ lỡ một số lib của trình biên dịch fortran. Cách tôi đã làm cho đến bây giờ là sao chép thủ công từ

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

tuy nhiên, điều này ngăn các liên kết được nhập một cách cẩn thận được đăng ký bởi lòng đỏ (in tất cả các lib hiện có trong virtualenv).

Vì vậy, có cách nào để thực hiện một biến thể chọn lọc của

virtualenv --system-site-packages

16
một lời nhắc nhở nhẹ nhàng - vui lòng chọn một câu trả lời nếu một trong những điều dưới đây có vẻ hoạt động.
foobarbiru

1
có vẻ như 12 người đã thử nghiệm cho bạn trong vài tháng qua ...
foobarbiru

2
Tại sao lại làm phiền OP? Tất cả chúng ta có thể thấy đó là câu trả lời phổ biến nhất; Liệu anh ấy có chấp nhận nó không? Tôi nghĩ rằng sự chính trực của anh ấy trong việc tự mình kiểm tra, thay vì chỉ đánh dấu vào câu trả lời phổ biến nhất, nên được ngưỡng mộ.
Michael Scheper

5
2013: Trả lời điểm giữa câu trả lời đúng và không chính xác khá giống nhau. OP cho biết anh sẽ kiểm tra. 2016: Michael Scheper rất ấn tượng đến nỗi OP (ba năm trước) cho biết sẽ thử nghiệm. 2017: Tôi bắt gặp câu hỏi này một lần nữa và thích thú.
foobarbiru

2
Không có câu trả lời đúng. OP yêu cầu chọn lọc --system-site-packages. Câu trả lời cho thấy sử dụng không chọn lọc --system-site-packagesvà sau đó cài đặt quá mức một số gói cục bộ, những gì khác nhau và có ý nghĩa khác nhau.
Piotr Jurkiewicz

Câu trả lời:


238

Tạo môi trường với virtualenv --system-site-packages . Sau đó, kích hoạt virtualenv và khi bạn muốn mọi thứ được cài đặt trong virtualenv chứ không phải python hệ thống, hãy sử dụng pip install --ignore-installedhoặc pip install -I. Bằng cách đó, pip sẽ cài đặt những gì bạn yêu cầu cục bộ ngay cả khi có phiên bản toàn hệ thống. Trình thông dịch python của bạn sẽ nhìn đầu tiên trong thư mục gói của virtualenv, vì vậy các gói đó sẽ phủ bóng lên toàn cầu.


45
Bằng cách sử dụng -I, bạn sẽ luôn cài đặt lại các gói, ngay cả khi chúng đã tồn tại trong thư mục gói toàn hệ thống. Nếu bạn sử dụng -U thay vào đó, nó sẽ cài đặt các phiên bản gói mới hơn vào virtualenv của bạn, nhưng sẽ không cài đặt lại bất kỳ gói nào đã có sẵn trong hệ thống với phiên bản bắt buộc.
Danilo Bargen

15
Bạn có biết nếu có bất kỳ cách nào để 'kích hoạt' tùy chọn --system-site-gói trên môi trường ảo được tạo trước đó không? Tôi rất muốn tránh những rắc rối khi cài đặt lại tất cả các gói địa phương của tôi!
Gabriel


Tôi thấy câu trả lời này rất thú vị, tuy nhiên tôi đã có một trường hợp rất kỳ lạ khi nó không hoạt động. Tôi có một virtualenv với no-global-site-packageskích hoạt. Nhưng vì một số lý do, tôi không biết có một gói được sử dụng từ hệ thống toàn cầu. Sử dụng pip install -Icho gói từ bên trong virtualenv không hoạt động. Cuối cùng tôi đã gỡ cài đặt tạm thời gói cả từ hệ thống virtualenv và toàn cầu, sau đó tôi có thể cài đặt lại trong virtualenv và trong hệ thống (theo thứ tự đó). Vì vậy, bây giờ nó hoạt động tốt.
kstenger

3
-1 Câu hỏi yêu cầu làm cho các gói nhất định hiển thị, không phải tất cả ngoại trừ các gói bị bóng. Làm trắng một bộ giới hạn sẽ an toàn hơn nhiều so với danh sách trắng vì nó cho phép đảm bảo rằng tất cả các gói phải tồn tại trong venv ngoại trừ các gói được liệt kê rõ ràng.
bluenote10

19

Bạn có thể sử dụng --system-site-packagesvà sau đó "cài đặt quá mức" các công cụ cụ thể cho virtualenv của mình. Bằng cách đó, mọi thứ bạn cài đặt vào virtualenv của bạn sẽ được lấy từ đó, nếu không nó sẽ được lấy từ hệ thống của bạn.


Tôi không chắc chắn chính xác những gì không rõ ràng, nhưng sẽ thử: nếu bạn tạo một virtualenv với tùy chọn --system-site-gói, trước tiên hệ thống sẽ cố gắng tìm các gói trong virtualenv của bạn, nếu nó không tìm thấy nó ở đó, nó sẽ cố gắng tìm nó trong cài đặt hệ thống python của bạn. Chỉ khi nó không tìm thấy nó ở đó, nó sẽ tăng và ImportError.
schacki

4
Vấn đề duy nhất với phương pháp này là bây giờ bạn có tất cả các thư viện hệ thống. Nơi bạn có thể muốn kiểm soát rất chặt chẽ những gì được cài đặt.
Dwayne

7
Điều không rõ ràng là làm thế nào điều này thực sự có thể! Nếu bạn cài đặt myprog trong một virtualenv được tạo bằng - gói hệ thống trang web nơi myprog tồn tại trong hệ thống, nó sẽ không "cài đặt quá mức" myprog. Nó sẽ chỉ thấy rằng myprog tồn tại và nói "Yêu cầu đã được thỏa mãn." Vậy ... ý bạn là gì?
foobarbiru

-5

Cài đặt ảo env với

virtualenv --system-site-packages

Và sử dụng pip install -U to install matplotlib


3
Điều này trái ngược với những gì câu hỏi được hỏi.
Dan Getz

-7

Bạn có thể sử dụng virtualenv --clear. Không cài đặt gói nào, sau đó cài đặt gói bạn muốn.


Đó không phải là một câu trả lời cho câu hỏi thực tế về cách sử dụng một số gói trên toàn hệ thống
MrLeeh
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.