YAML脚本未在Env_Name环境安装requirements.txt包的问题排查
问题描述
我编写了如下YAML脚本,本应在新建的Env_Name虚拟环境中安装requirements.txt内的依赖包:
- script: | python -m venv Env_Name cd Env_Name .\scripts\Activate displayName: 'Create & Activate Env_Name ' - script: | python -m pip install --upgrade pip displayName: 'Install dependencies' - script: | pip install wheel displayName: 'Wheel install' - script: | pip install python_ldap-3.4.0-cp311-cp311-win_amd64.whl displayName: 'Install ldap from wheel' - script: | type requirements.txt displayName: 'display the content of the requirements file' - script: | pip install -r requirements.txt -v displayName: 'packages installation' - script: | pip list displayName: 'Display packages' - script: | python setup.py sdist displayName: 'Artifact creation' - task: CopyFiles@2 inputs: targetFolder: $(Build.ArtifactStagingDirectory) - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'My_App' publishLocation: 'Container'
执行后,pip list显示依赖包已安装:
pip list ========================== Starting Command Output =========================== "C:\Windows\system32\cmd.exe" /D /E:ON /V:OFF /S /C "CALL "D:\a\_temp\f53d2436-67e2-4d6f-bf00-e90e1dfcb18c.cmd"" Package Version -------------------- ------------ asgiref 3.7.2 beautifulsoup4 4.12.2 certifi 2023.7.22 cffi 1.15.1 charset-normalizer 3.2.0 contourpy 1.1.1 cryptography 41.0.3 cx_Oracle 8.3.0 cycler 0.11.0 Django 4.2.5 django-adminlte3 0.1.6 django-auth-ldap 4.6.0 django-mssql-backend 2.8.1 et-xmlfile 1.1.0 fonttools 4.42.1 idna 3.4 joblib 1.3.2 kiwisolver 1.4.5 lxml 4.9.3
但查看Env_Name环境的site-packages目录时,未发现requirements.txt中的包。现咨询:
- 这些包实际安装在何处?
- 如何通过脚本查看其安装路径?
- 如何让包正确安装到
Env_Name环境中?
问题解答
1. 包实际安装位置
这些包安装在了系统全局Python环境或构建代理默认的Python环境里。因为每个script任务都是独立进程,第一个脚本里的虚拟环境激活操作仅在当前进程生效,后续脚本任务会启动新进程,不会继承之前的虚拟环境状态,所以所有pip install命令都是调用全局Python的pip执行的。
2. 查看安装路径的脚本方法
在任意script任务中添加以下命令,即可查看当前pip对应环境的路径信息:
# 查看当前pip关联的Python解释器路径 pip --version # 查看全局包安装路径 python -c "import site; print(site.getsitepackages())" # 查看单个包的具体安装路径 pip show Django # 替换为你要检查的包名
3. 正确安装到虚拟环境的方法
有两种可靠方案解决进程隔离导致的环境不继承问题:
方案一:将所有环境相关命令合并到同一个script任务
虚拟环境激活仅在当前进程有效,把创建环境、激活环境、安装依赖的命令放在同一个脚本块中:
- script: | python -m venv Env_Name .\Env_Name\scripts\Activate python -m pip install --upgrade pip pip install wheel pip install python_ldap-3.4.0-cp311-cp311-win_amd64.whl type requirements.txt pip install -r requirements.txt -v pip list python setup.py sdist displayName: 'Create Env, Activate & Install Dependencies'
方案二:直接调用虚拟环境的Python和pip
不需要激活环境,每个脚本任务直接指定虚拟环境内的Python解释器和pip路径,明确指向目标环境:
- script: | python -m venv Env_Name displayName: 'Create Env_Name' - script: | .\Env_Name\Scripts\python.exe -m pip install --upgrade pip displayName: 'Upgrade pip in Env_Name' - script: | .\Env_Name\Scripts\pip.exe install wheel displayName: 'Install wheel in Env_Name' - script: | .\Env_Name\Scripts\pip.exe install python_ldap-3.4.0-cp311-cp311-win_amd64.whl displayName: 'Install ldap from wheel in Env_Name' - script: | type requirements.txt displayName: 'display the content of the requirements file' - script: | .\Env_Name\Scripts\pip.exe install -r requirements.txt -v displayName: 'Install packages in Env_Name' - script: | .\Env_Name\Scripts\pip.exe list displayName: 'Display packages in Env_Name' - script: | .\Env_Name\Scripts\python.exe setup.py sdist displayName: 'Artifact creation using Env_Name'
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

