pip устанавливает пакеты в virtualenv и глобально при вызове из bash-скрипта - PullRequest
3 голосов
/ 18 июня 2019

Я пытаюсь активировать среду Python и устанавливаю некоторые пакеты, используя pip в файле bash. Он успешно устанавливается в среде, но также устанавливается глобально на моем Mac, и я не понимаю, почему.

script.sh:

#!/bin/bash
source '<absolute path>/venv/bin/activate'
which pip
pip install psutil
pip list

выход:

$ ./script.sh
<absolute path>/venv/bin/pip
...
Package          Version  
---------------- ---------
pip              19.0.3   
psutil           5.6.3    
setuptools       41.0.1  
wheel            0.33.1   

Но в другом терминале без виртуальной среды также устанавливается:

$ which pip
/usr/local/opt/python/libexec/bin/pip
$ pip list
Package          Version  
---------------- ---------
pip              19.0.3   
psutil           5.6.3   
setuptools       41.0.1    
wheel            0.33.1   

Если я набираю команды в скрипте одну за другой в терминале, он работает как положено.
Чего мне не хватает?

редактирование:
Если я запускаю pip freeze | xargs pip uninstall -y (в env или глобально), он удаляет пакеты как в virtualenv, так и глобально.
Если я снова запускаю сценарий и перечисляю содержимое в 'site-packages' ls venv/lib/python3.7/site-packages, установленного пакета там нет, поэтому мой 'venv / bin / pip' каким-то образом указывает на мои глобальные 'site-packages'?

edit2: Я нашел способ воспроизвести поведение.
1. создать среду python -m venv venv_test
2. активировать среду . venv_test/bin/activate
3. изменить source '<absolute path>/venv_test/bin/activate' в script.sh
4. запустить скрипт ./script.sh

Почему это заставляет pip устанавливать глобально?

Если я пропущу 2. это работает как положено.

1 Ответ

3 голосов
/ 18 июня 2019

Выполнение этого в скрипте bash запускает команды в другой оболочке, а затем возвращает вас в исходную оболочку. Запуск source <path>/bin/activate запускает это в текущей оболочке, следовательно, это работает из командной строки. Ваш скрипт bash выглядит так:

#!/bin/bash
source "<absolute path>/venv/bin/activate"
which pip
pip install psutil
pip listenter code here

Если вы вызовете это с помощью source script.sh, это запустит это в вашей текущей оболочке и должно работать как положено. Надеюсь это поможет. Здесь есть несколько других методов: https://stackoverflow.com/a/13122219/7473057

Пример метода для virtualenvs:

  1. создать среду python -m venv venv_test или virtualenv venv_test
  2. активировать среду: source ./venv_test/bin/activate (в строке cmd)
  3. скрипт запуска ./script.sh, с которого source "<absolute path>/venv/bin/activate" удалено.

В качестве альтернативы, я думаю, что вы ищите это подоболочка, которая запускает все внутри, что находится по ссылке выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...