【问题标题】:Pip not activated properly when using venv in Jenkins在 Jenkins 中使用 venv 时 Pip 未正确激活
【发布时间】:2019-04-22 11:33:42
【问题描述】:

我正在使用在 Raspberry Pi 3(运行 Rasbian)上运行的 Jenkins。在这个 Jenkins 实例上,我想使用 venv 在虚拟环境中运行 Python (3.6)。但是,当我运行我的脚本(使用 Jenkins Execute-shell 构建步骤)并激活 pip 时,它无法正常工作,我无法使用已安装的模块。在终端中运行完全相同的脚本可以完美运行,我可以使用该模块。

我试图找到问题所在,当我通过 Jenkins 运行脚本时,似乎没有使用 venv 中的 pip

在 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 运行它时,似乎没有使用 venv 中的 Pip,而是使用了系统默认的 Pip。出于某种原因,pip --versionwhich 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 

【问题讨论】:

  • 您可能有一个全局 pip 配置(或影响 pip 的环境变量)生效。另外,venv中的python -m pip有同样的效果吗?
  • @AKX: python -m pip 似乎与pip 不同。 python -m pip 指向我的env 中的pip。如果我在脚本中从pip 更改为python -m pip,它似乎可以正常工作。你知道这可能是什么原因吗?我的 PATH/环境变量中有 pip(连接到 python 2.7),但我认为这不会有问题,一旦我激活它,pip 将被重定向到我的venv 内的pip,但是不是这样吗?

标签: python bash jenkins pip python-venv


【解决方案1】:

你可以试试 Pyenv Jenkins PLugin Pyenv

我测试了你的脚本,它似乎可以工作,只需添加 #!/bin/bashshebang。

【讨论】:

    猜你喜欢
    • 2022-12-29
    • 2018-09-11
    • 2020-10-31
    • 2019-04-09
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多