Jenkins中使用pipenv创建Virtualenv失败问题求助
问题根因
该问题和Jenkins插件无关,也不是Python 3.8版本兼容导致,核心是pipenv版本调用冲突:
- Ubuntu 20.04系统通过apt源预装了老旧的
pipenv==11.9.0,可执行文件路径为/usr/bin/pipenv,在系统PATH中优先级很高 - 你执行
pip3 install pipenv==2022.5.2时,默认将新版本安装到用户级目录,对应可执行文件在~/.local/bin/路径,优先级低于系统路径下的旧版本 - 后续执行
pipenv install时,实际调用的是系统自带的11.9.0旧版本,新旧版本文件混杂,才会触发找不到pipenv.pew模块、__str__ returned non-string的报错。报错栈中load_entry_point('pipenv==11.9.0', 'console_scripts', 'pipenv')()的记录可以直接实锤这个问题。
解决方案
任选以下一种方案修改即可:
- 方案1:通过python模块方式显式调用安装的新版本pipenv,完全避开路径冲突
修改Jenkinsfile中依赖安装阶段的代码,将所有直接调用pipenv的命令替换为python3 -m pipenv,保证调用的是你刚通过pip3安装的2022.5.2版本:
stage('Install dependencies') { steps { echo 'Install dependencies' sh 'python3 --version' sh 'pip3 install pipenv==2022.5.2' // 显式通过python模块调用,避免命中系统旧版本 sh 'python3 -m pipenv --rm || exit 0' sh 'python3 -m pipenv install' } }
- 方案2:提前卸载系统自带的旧版本pipenv,从根源消除冲突
在安装pipenv的步骤前增加卸载系统旧版本的命令,安装完成后增加版本校验步骤确认调用正确:
stage('Install dependencies') { steps { echo 'Install dependencies' sh 'python3 --version' // 卸载系统预装的老旧pipenv sh 'sudo apt remove -y pipenv || exit 0' sh 'pip3 install pipenv==2022.5.2' // 校验版本,确认输出为pipenv, version 2022.5.2 sh 'pipenv --version' sh 'pipenv --rm || exit 0' sh 'pipenv install' } }
- 方案3:将指定版本的pipenv安装到系统级路径,覆盖旧版本优先级
将pipenv安装命令改为系统级安装,新版本会部署到/usr/local/bin/路径,优先级高于/usr/bin下的旧版本,调用时会自动命中新版本:sh 'sudo pip3 install pipenv==2022.5.2'
注意:Ubuntu 20.04 apt源内置的pipenv 11.9.0是2018年发布的老旧版本,本身和Python3.8、新版Pipfile规范存在大量兼容问题,无论是否使用Jenkins都不建议直接使用该版本。
内容的提问来源于stack exchange,提问作者Smaillns
相关产品推荐
相关产品推荐

