virtualenv --no-site-пакети та піп все ще знаходять глобальні пакети?


136

У мене було враження, що virtualenv --no-site-packagesце створить абсолютно окреме і ізольоване середовище Python, але, схоже, це не буде.

Наприклад, у мене встановлено python-django у всьому світі, але хочу створити virtualenv з іншою версією Django.

$ 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

З того, що я можу сказати, pip -E foo installвищевикладене повинно перевстановити нову версію Django. Крім того, якщо я скажу pip заморожувати навколишнє середовище, я отримую цілу партію пакетів. Я б очікував, що для свіжого середовища --no-site-packagesце буде порожнім?

$ 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 ...

Я нерозумію, як --no-site-packagesце має працювати?


4
FYI, --no-site-пакети застаріли. Дивіться тут
Салем Бен Маброук

@SalemBenMabrouk Посилання зламане, нове посилання тут. Пов'язана проблема на Github: Чи нещодавно зник прапор '--no-site-пакети'?
Ynjxsjmh

У цьому посиланні йдеться про --no-site-packagesВИМОЖЕНО. Зберігається лише для зворотної сумісності. Відсутність доступу до глобальних пакетів сайтів тепер є поведінкою за замовчуванням . Якщо ви хочете отримати доступ до глобальних пакетів сайтів, ви можете увімкнути їх --system-site-packages.
Ynjxsjmh

Відповіді:


107

У мене була така проблема, поки я не зрозумів, що (задовго до того, як я виявив virtualenv), я пішов додавати каталоги до PYTHONPATH у моєму файлі .bashrc. Як це минуло за рік до цього, я не думав про це відразу.


12
Мій герой! Якщо ви просто хочете перевірити, чи це проблема у вас дуже швидко, ви можете запустити принтенв, щоб побачити, чи є PYTHONPATH, а якщо він є, запустіть невстановлений PYTHONPATH. Вам все одно доведеться вишукувати проблему, якщо ви не хочете, щоб ця проблема з’явилася більше, але це дозволить вам отримати новий virtualenv, встановлений у поточному сеансі оболонки.
UltraBob

Домашня мова робить це теж!
Роб

1
Я б хотів, щоб я міг висипати вас більше. Я не раз приходив на цю сторінку після того, як стикався з матеріалами, які були через те, що мій PYTHONPATH вже встановлений.
Бемму

Я знаю, що це справді (дійсно) стара публікація, але я шукав всюди, в тому числі, задаючи деякі власні запитання щодо SO, і я не можу зрозуміти, як дістатися --no-site-packagesдо роботи. Я наближаюся до того, щоб просто витерти ubuntu і побачити, чи це виправляє речі. Спочатку я думав, що у мене є та ж проблема з PYTHONPATH, але під час бігу printenvя не бачу цього. Розчарування зростає, і будь-яка допомога дуже цінується. Мій sys.path з внутрішньої програми, створеної з, --no-site-packagesсхоже, містить усі мої каталоги пакунків. Я не знаю, як це змінити. Допомога?
NotAnAmbiTurner

Це також може стосуватися вашої глобальної PATHзмінної, якщо ви також знаходите виконувані файли поза межами virtualenv.
Ендерленд

27

Ви повинні переконатися, що ви використовуєте pipбінарне у створеному вами віртуальному середовищі, а не глобальному.

env/bin/pip freeze

Дивіться тест:

Створюємо virtualenv з --no-site-packagesможливістю:

$ 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.

Ми перевіряємо вихід freezeіз новоствореного pip:

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

Але якщо ми все-таки використовуємо глобальний pip, це ми отримуємо:

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

Тобто всі пакети, які pipвстановлені у всій системі. Перевіряючи, which pipми отримуємо (принаймні, в моєму випадку) щось на кшталт /usr/local/bin/pip, що означає, що коли ми pip freezeце робимо, то називаємо цей двійковий файл замість mytest/bin/pip.


У мене була така ж проблема. Цікаво, як це сталося, оскільки при першому виклику заморожування піп-сервісу мені показало правильні пакети, але через пару днів він почав дзвонити на той, який знаходиться за адресою / usr / local / bin / ...
jimijazz

1
Це було проблемою для мене: я був схильний pipдо певного шляху до глобальної точки, яку не було перекрито при активації virtualenv.
merlinND

1
Ви щойно врятували мене, це добре спрацювало для мене (pip3 & python3.7) Спасибі
Saed Yousef

24

Врешті-решт я виявив, що з будь-якої причини піп -Е ​​не працює. Однак якщо я фактично активую virtualenv і використовую easy_install, наданий virtualenv, для встановлення pip, то використовую pip безпосередньо зсередини, це, здається, працює як очікувалося і показувати лише пакети у virtualenv


2
FWIW, з поточними версіями магістральних файлів pip та virtualenv ваш оригінальний робочий процес зараз робить все для мене правильно. При цьому я особисто все-таки уникаю -E і просто встановлюю pip у кожному virtualenv.
Карл Мейєр

17

Я знаю, що це дуже старе питання, але для тих, хто приїжджає сюди, шукають рішення:

Не забувайте перед запуском активувати virtualenv ( source bin/activate) pip freeze. Інакше ви отримаєте список усіх глобальних пакетів.


Дякую вам за це, я знав, що треба використовувати джерело з virtualenv, але не для virtualenvwrapper, і ніколи не чув про заморожування піп. Ще раз спасибі
Deepend

ПРАВИЛЬНА ВІДПОВІДЬ. після ініціалізації virtualenv ви повинні активувати його, або ви будете використовувати системну версію python
AsAP_Sherb

16

Тимчасово очистити за PYTHONPATHдопомогою:

export PYTHONPATH=

Потім створіть та активізуйте віртуальне середовище:

virtualenv foo
. foo/bin/activate

Тільки тоді:

pip freeze

15

--no-site-packagesслід, як випливає з назви, видалити зі стандартного каталогу пакунків сайтів sys.path. Все, що живе в стандартному шляху Python, залишиться там.


1
Для мене очищення мій PYTHONPATHз , export PYTHONPATH=здавалося, зробити трюк.
ялівець-

4

Подібна проблема може виникнути в Windows, якщо ви зателефонуєте безпосередньо до скриптів, у script.pyяких потім використовується відкривач за замовчуванням Windows і відкриється Python поза віртуальним середовищем. Викликаючи його з python script.py, використовуватиме Python у віртуальному середовищі.


У верхній частині сценарію має бути рядок shebang (починаючи з "! #"), Який буде вказувати на інтерпретований, який використовується для e.
wobbily_col

2

Це також здається, коли ви переміщуєте каталог virtualenv в інший каталог (на Linux) або перейменовуєте батьківський каталог.


1

У мене була ця сама проблема. Проблема для мене (на Ubuntu) полягала в тому, що назва мого шляху містила $. Коли я створив virtualenv поза $ dir, він спрацював чудово.

Дивно.


1

Однією з можливих причин, по якій virtualenv pip не буде працювати, є те, якщо в одній з батьківських папок було простір у своєму імені, /Documents/project name/app перейменувавши його для /Documents/projectName/appвирішення проблеми.


1

Я зіткнувся з тією ж проблемою, коли pip у venv досі працює як глобальний pip.
Після пошуку багатьох сторінок я розбираю це таким чином.
1. Створіть новий venv від virtualenv з опцією "--no-site-пакети"

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

зауважте, що хоч параметр "--no-site-пакети" був за замовчуванням правдою з 1.7.0 у файлі doc virtualenv, але я виявив, що він не працює, якщо ви не встановите його вручну. Для того, щоб отримати чисту вену, я настійно пропоную ввімкнути цю опцію 2. Активуйте створене вами нове оточення

source ./my_env_name/bin/activate
  1. Перевірте своє розташування піп і розташування пітона та переконайтеся, що ці дві команди знаходяться під віртуальним оточенням
pip --version
which python
  1. Використовуйте pip під віртуальним env, щоб встановити пакети, вільні від переривання глобальних пакетів
pip install package_name

Бажаю, щоб ця відповідь допомогла вам!


0

Ось список всіх ПГИ встановити параметри - я не знайшов « -Eваріант», може бути більш старої версії був. Нижче я ділюсь звичайним використанням англійською мовою та роботою virtualenvдля майбутніх користувачів ЗП.


Кожна річ здається прекрасною, прийміть активацію virtualenv( foo). Все, що вона робить - це дозволяє нам мати декілька (і варіюючих) середовищ python, тобто різні версії Python, або різні версії Django, або будь-який інший пакет Python - якщо у нас є попередня версія у виробництві та хочемо протестувати останню версію Django з нашою застосування.

Якщо коротко, створення та використання (активації) віртуального середовища ( virtualenv) дає змогу запустити або протестувати наше додаток або прості сценарії python з різним інтерпретатором Python, тобто Python 2.7 і 3.3 - може бути свіжою установкою (з використанням --no-site-packagesопції) або всі пакети з існуючих / остання установка (використовуючи --system-site-packagesопцію). Для його використання ми повинні його активувати:

$ pip install djangoвстановить його в глобальний пакет сайтів і аналогічно отримуючи pip freezeімена, дасть назви глобальних пакетів сайтів.

в той час, як всередині Venv dir (foo) виконання $ source /bin/activateбуде активувати venv, тобто зараз все, що встановлено за допомогою pip, буде встановлено лише у віртуальній env, і лише тепер заморозка піп не надасть список глобальних пакетів сайтів python. Після активації:

$ 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)до того, як $знак вказує, що ми використовуємо віртуальне середовище python, тобто будь-яка річ із системою pip - встановити, заморозити, видалити буде обмежено цим venv, і це не вплине на глобальну установку / пакети Python за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.