virtualenv --no-site-gói và pip vẫn tìm gói toàn cầu?


136

Tôi đã có ấn tượng rằng virtualenv --no-site-packagessẽ tạo ra một môi trường Python hoàn toàn riêng biệt và tách biệt, nhưng dường như không.

Ví dụ, tôi đã cài đặt python-django trên toàn cầu, nhưng muốn tạo một virtualenv với phiên bản Django khác.

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django

Từ những gì tôi có thể nói, pip -E foo installở trên có nghĩa vụ cài đặt lại một phiên bản mới của Django. Ngoài ra, nếu tôi bảo pip đóng băng môi trường, tôi nhận được rất nhiều gói. Tôi mong đợi rằng một môi trường trong lành với --no-site-packagesđiều này sẽ trống?

$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...

Tôi có hiểu lầm làm thế nào --no-site-packageslà phải làm việc?


4
FYI, --no-site-gói trở nên không dùng nữa. Xem tại đây
Salem Ben Mabrouk

@SalemBenMabrouk Liên kết bị hỏng, liên kết mới tại đây. Vấn đề liên quan trên Github: Cờ '--no-site-gói' gần đây đã biến mất?
Ynjxsjmh

Trong liên kết đó, nó nói --no-site-packageslà ĐỔI. Chỉ giữ lại để tương thích ngược. Không có quyền truy cập vào các gói trang web toàn cầu bây giờ là hành vi mặc định . Nếu bạn muốn truy cập vào các gói trang web toàn cầu, bạn có thể kích hoạt --system-site-packages.
Ynjxsjmh

Câu trả lời:


107

Tôi đã gặp một vấn đề như thế này, cho đến khi tôi nhận ra rằng (rất lâu trước khi tôi phát hiện ra virtualenv), tôi đã thêm các thư mục vào PYTHONPATH trong tệp .bashrc của mình. Vì đã hơn một năm trước, tôi không nghĩ về điều đó ngay lập tức.


12
Anh hùng của tôi! Nếu bạn chỉ muốn kiểm tra xem đó có phải là vấn đề của bạn thực sự nhanh chóng hay không, bạn có thể chạy printenv để xem PYTHONPATH có ở đó không, và nếu có, hãy chạy PYTHONPATH. Bạn vẫn sẽ phải theo dõi vấn đề nếu bạn không muốn vấn đề này xuất hiện nữa, nhưng điều đó sẽ cho phép bạn có một virtualenv mới được thiết lập trong phiên shell hiện tại.
UltraBob

Homebrew cũng làm điều này!
Cướp

1
Tôi ước tôi có thể nâng cao bạn nhiều hơn. Tôi đã đến trang này hơn một lần sau khi bắt gặp những thứ đó là do PYTHONPATH của tôi đã được đặt.
Bemmu 7/07/2015

Tôi biết đây là một bài viết thực sự (thực sự) cũ, nhưng tôi đã tìm kiếm ở khắp mọi nơi, bao gồm cả việc hỏi một số câu hỏi của riêng tôi về SO, và tôi không thể tìm ra cách --no-site-packagesđể làm việc. Tôi đang tiến gần đến việc xóa sạch Ubuntu và xem điều đó có khắc phục được không. Ban đầu tôi nghĩ rằng tôi đang gặp vấn đề PYTHONPATH tương tự, nhưng khi chạy printenv, tôi không thể nhìn thấy nó. Thất vọng được gắn kết, và bất kỳ trợ giúp được đánh giá cao. Sys.path của tôi từ bên trong một venv được tạo ra --no-site-packagesdường như bao gồm tất cả các thư mục gói của tôi. Tôi chưa biết cách sửa đổi điều này. Cứu giúp?
NotAnAmbiTurner

Điều này cũng có thể áp dụng cho PATHbiến toàn cục của bạn nếu bạn cũng đang tìm các tệp thực thi từ bên ngoài virtualenv.
enderland 22/03/2016

27

Bạn phải chắc chắn rằng bạn đang chạy pipnhị phân trong môi trường ảo bạn đã tạo chứ không phải toàn cầu.

env/bin/pip freeze

Xem một bài kiểm tra:

Chúng tôi tạo virtualenv với --no-site-packagestùy chọn:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.

Chúng tôi kiểm tra đầu ra của freezetừ mới được tạo pip:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

Nhưng nếu chúng ta sử dụng toàn cầu pip, đây là những gì chúng ta nhận được:

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

Đó là, tất cả các gói pipđã được cài đặt trong toàn hệ thống. Bằng cách kiểm tra, which pipchúng tôi nhận được (ít nhất là trong trường hợp của tôi) một cái gì đó giống như /usr/local/bin/pip, có nghĩa là khi chúng tôi làm điều pip freezeđó là gọi nhị phân này thay vì mytest/bin/pip.


Tôi đã từng gặp vấn đề tương tự. Tôi tự hỏi làm thế nào nó xảy ra, vì lúc đầu gọi pip đóng băng đã chỉ cho tôi các gói chính xác, nhưng một vài ngày sau nó bắt đầu gọi một gói ở / usr / local / bin / ...
jimijazz

1
Đây là vấn đề đối với tôi: Tôi đã đặt bí danh pipcho một đường dẫn cụ thể đến đường ống toàn cầu, vốn không bị ghi đè khi kích hoạt virtualenv.
merlinND

1
Bạn vừa cứu tôi, điều này làm việc rất tốt cho tôi (pip3 & python3.7) Cảm ơn
Saed Yousef

24

Cuối cùng, tôi thấy rằng, vì bất kỳ lý do gì, pip -E không hoạt động. Tuy nhiên, nếu tôi thực sự kích hoạt virtualenv và sử dụng easy_install do virtualenv cung cấp để cài đặt pip, sau đó sử dụng pip trực tiếp từ bên trong, nó dường như hoạt động như mong đợi và chỉ hiển thị các gói trong virtualenv


2
FWIW, với các phiên bản trung kế hiện tại của pip và virtualenv quy trình làm việc ban đầu của bạn bây giờ thực hiện đúng, đối với tôi dù thế nào đi nữa. Điều đó nói rằng, cá nhân tôi vẫn tránh -E và chỉ cài đặt pip trong mỗi virtualenv.
Carl Meyer

17

Tôi biết đây là một câu hỏi rất cũ nhưng đối với những người đến đây để tìm kiếm một giải pháp:

Đừng quên kích hoạt virtualenv ( source bin/activate) trước khi chạy pip freeze. Nếu không, bạn sẽ nhận được một danh sách tất cả các gói toàn cầu.


Cảm ơn bạn rất nhiều vì điều này, tôi biết rằng tôi phải sử dụng nguồn với virtualenv nhưng không phải cho virtualenvwrapper và tôi chưa bao giờ nghe nói về việc đóng băng pip. Cảm ơn một lần nữa
Deepend

CÂU TRẢ LỜI CHÍNH XÁC. Sau khi khởi chạy virtualenv, bạn phải kích hoạt nó hoặc bạn sẽ sử dụng phiên bản hệ thống của python
AsAP_Sherb

16

Tạm thời xóa PYTHONPATHbằng:

export PYTHONPATH=

Sau đó tạo và kích hoạt môi trường ảo:

virtualenv foo
. foo/bin/activate

Chỉ sau đó:

pip freeze

15

--no-site-packagesnên, như tên cho thấy, loại bỏ thư mục gói trang web tiêu chuẩn khỏi sys.path. Bất cứ điều gì khác sống trong đường dẫn Python tiêu chuẩn sẽ vẫn ở đó.


1
Đối với tôi làm sạch của tôi PYTHONPATHvới export PYTHONPATH=dường như để làm các mẹo.
cây bách xù-

4

Một vấn đề tương tự có thể xảy ra trên Windows nếu bạn gọi các tập lệnh trực tiếp khi script.pynó sử dụng trình mở mặc định của Windows và mở Python bên ngoài môi trường ảo. Gọi nó với python script.pysẽ sử dụng Python với môi trường ảo.


Cần có một dòng shebang ở đầu tập lệnh (bắt đầu bằng '! #') Sẽ chỉ ra cách hiểu được sử dụng cho e.
wobbily_col

2

Điều này dường như cũng xảy ra khi bạn di chuyển thư mục virtualenv sang thư mục khác (trên linux) hoặc đổi tên thư mục mẹ.


1

Tôi đã có vấn đề tương tự. Vấn đề đối với tôi (trên Ubuntu) là tên đường dẫn của tôi có chứa $. Khi tôi tạo một virtualenv bên ngoài $ dir, nó hoạt động tốt.

Kỳ dị.


1

Một trong những lý do có thể khiến cho virtualenv pip không hoạt động là nếu bất kỳ thư mục mẹ nào có không gian trong tên của nó /Documents/project name/app đổi tên nó để /Documents/projectName/appgiải quyết vấn đề.


1

Tôi đã gặp vấn đề tương tự khi pip trong venv vẫn hoạt động như pip toàn cầu.
Sau khi tìm kiếm nhiều trang, tôi tìm ra nó theo cách này.
1. Tạo một venv mới bằng virtualenv với tùy chọn "--no-site-gói"

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

xin lưu ý rằng mặc dù tùy chọn "--no-site-gói" là mặc định đúng kể từ 1.7.0 trong tệp doc của virtualenv, nhưng tôi thấy nó không hoạt động trừ khi bạn đặt thủ công. Để có được một venv thuần túy, tôi thực sự khuyên bạn nên bật tùy chọn này trên 2. Kích hoạt env mới mà bạn đã tạo

source ./my_env_name/bin/activate
  1. Kiểm tra vị trí pip và vị trí python của bạn và đảm bảo hai lệnh này đang trong môi trường ảo
pip --version
which python
  1. Sử dụng pip trong env ảo để cài đặt các gói miễn phí từ các gói toàn cầu
pip install package_name

Mong câu trả lời này giúp bạn!


0

Đây là danh sách tất cả các tùy chọn cài đặt pip - Tôi không tìm thấy bất kỳ -Etùy chọn '' nào, có thể là phiên bản cũ hơn có nó. Dưới đây tôi đang chia sẻ cách sử dụng tiếng Anh đơn giản và làm việc virtualenvcho người dùng SO sắp tới.


Mọi thứ có vẻ ổn, chấp nhận kích hoạt virtualenv( foo). Tất cả những gì nó làm là cho phép chúng tôi có nhiều môi trường python (và khác nhau), tức là các phiên bản Python khác nhau, hoặc các phiên bản Django khác nhau hoặc bất kỳ gói Python nào khác - trong trường hợp chúng tôi có phiên bản trước đó trong sản xuất và muốn thử nghiệm phiên bản Django mới nhất với chúng tôi ứng dụng.

Trong một thời gian ngắn tạo và sử dụng (kích hoạt) môi trường ảo ( virtualenv) cho phép chạy hoặc kiểm tra ứng dụng của chúng tôi hoặc các tập lệnh python đơn giản với trình thông dịch Python khác nhau, ví dụ Python 2.7 và 3.3 - có thể là một bản cài đặt mới (sử dụng --no-site-packagestùy chọn) hoặc tất cả các gói từ hiện có / thiết lập cuối cùng (sử dụng --system-site-packagestùy chọn). Để sử dụng nó, chúng ta phải kích hoạt nó:

$ pip install djangosẽ cài đặt nó vào các gói trang web toàn cầu và tương tự nhận được pip freezetên của các gói trang web toàn cầu.

trong khi bên trong venv dir (foo) thực thi $ source /bin/activatesẽ kích hoạt venv tức là bây giờ mọi thứ được cài đặt với pip sẽ chỉ được cài đặt trong env ảo và chỉ bây giờ pip đóng băng sẽ không đưa ra danh sách các gói python gói toàn cầu. Sau khi kích hoạt:

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate 
(foo)$ pip install django

(foo)trước khi $dấu hiệu cho thấy chúng ta đang sử dụng môi trường python ảo, tức là mọi thứ với pip - install, freeze, Uninstall sẽ bị giới hạn ở venv này và không ảnh hưởng đến các gói / cài đặt Python toàn cầu / mặc định.

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.