#python #bash #jenkins #pip #python-venv
#python #bash #дженкинс #pip #python-venv
Вопрос:
Я использую Jenkins, работающий на Raspberry Pi 3 (работает под управлением Rasbian). В этом экземпляре Jenkins я хочу запустить Python (3.6) в виртуальной среде, используя venv
. Однако, когда я запускаю свой скрипт (используя Jenkins Execute-shell build-step) и активирую pip
, он не работает должным образом, и я не могу использовать установленные модули. Запуск точно такого же скрипта в терминале работает отлично, и я могу использовать модуль.
Я пытался найти проблему, и похоже pip
, что in venv
не используется, когда я запускаю скрипт через Jenkins.
В jenkins я добавил следующее после venv
установки и активации, чтобы попытаться отладить его. Рабочее пространство находится в /var/lib/jenkins/workspace/Test Python VENV/
:
>python --version
Python 3.6.5
>pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
>which python
/var/lib/jenkins/workspace/Test Python VENV/venv/bin/python
>which pip
/var/lib/jenkins/workspace/Test Python VENV/venv/bin/pip
>pip install coverage
Collecting coverage
Installing collected packages: coverage
Successfully installed coverage-4.5.3
>pip show coverage | grep Location
Location: /var/lib/jenkins/.local/lib/python2.7/site-packages
>python -m coverage --version
/var/lib/jenkins/workspace/Test Python VENV/venv/bin/python: No module named coverage
Однако, если я запускаю тот же скрипт в терминале (т. Е. Вне Jenkins), он работает, и я получаю следующее (каталог есть ~Develop/python_test/
):
>python --version
Python 3.6.5
>pip --version
pip 9.0.3 from /home/pi/Develop/python_test/venv/lib/python3.6/site-packages (python 3.6)
>which python
/home/pi/Develop/python_test/venv/bin/python
>which pip
/home/pi/Develop/python_test/venv/bin/pip
>pip install coverage
Collecting coverage
Installing collected packages: coverage
Successfully installed coverage-4.5.3
>pip show coverage | grep Location
Location: /home/pi/Develop/python_test/venv/lib/python3.6/site-packages
>python -m coverage --version
Coverage.py, version 4.5.3 with C extension
Итак, моя проблема в том, что когда я запускаю это через Jenkins, Pip в venv, похоже, не используется, вместо этого используется системный Pip по умолчанию. И по какой-то причине pip --version
и which pip
показывает два разных пути в Jenkins.
Полный скрипт, который я запускаю (как в Jenkins, так и в терминале), можно найти ниже:
echo Creating and activating virtual environment
python="python3.6"
venv_name="venv"
echo VERSIONS BEFORE VENV
python --version
pip --version
which python
which pip
echo 'Creating venv'
$python -m venv $venv_name
echo 'Activating venv'
. $venv_name/bin/activate
echo VERSIONS AFTER VENV
python --version
pip --version
which python
which pip
pip install coverage
pip show coverage | grep Location
python -m coverage --version
Комментарии:
1. Возможно, у вас действует глобальная конфигурация pip (или переменные среды, влияющие на pip). Кроме того, имеет ли
python -m pip
внутри venv тот же эффект?2. @AKX:
python -m pip
похоже, это не тот же pip, что и justpip
.python -m pip
указывает наpip
внутреннюю часть моегоenv
. Если я изменю сpip
наpython -m pip
в своем скрипте, похоже, он работает. Знаете ли вы, что может вызвать это? У меня есть pip (подключенный к python 2.7) в моей переменной PATH / environment, но я подумал, что это не будет проблемой,pip
и он будет перенаправлен наpip
inside myvenv
, как только я его активирую, но разве это не так?
Ответ №1:
Вы можете попробовать Pyenv плагин Pyenv Дженкинса
Я протестировал ваш скрипт, и, похоже, он работает, просто добавьте #!/bin/bash
shebang.