pip未自动安装依赖问题:基于自定义setup.py配置排查
排查pip未自动安装依赖的问题
结合你的setup.py和场景,我整理了几个常见原因和对应的解决办法,你可以逐一排查:
1. 检查安装命令是否意外跳过依赖
先确认你有没有用--no-deps这类会跳过依赖安装的参数,或者环境变量里有没有相关配置。确保用标准的安装命令:
pip install mypackage --index-url <你的内部仓库地址>
如果之前加了--no-deps,去掉后重新安装试试。
2. 修复__version__导入的潜在问题
你的setup.py开头直接从mylib导入__version__,但如果mylib的代码(比如__init__.py)本身依赖paramiko,那在打包阶段这个导入会失败,导致setup函数没正确执行,依赖信息根本没被写入包的元数据里。
解决办法是换一种安全的版本号获取方式,比如直接写在setup.py里:
from setuptools import setup # 直接定义版本号,避免提前导入包内模块 __version__ = "0.1.0" requirements = ['paramiko'] tests_require = ['pytest'] def main(): setup( name='mypackage', description='A collection of utilities', url='http://example.net', version=__version__, author='Me Me', author_email='me@me.net', packages=['mylib'], zip_safe=False, install_requires=requirements, tests_require=tests_require, ) if __name__ == '__main__': main()
重新打包上传后,依赖信息就能被正确识别了。
3. 优先上传wheel包而非源码包
源码包(sdist)在安装时需要本地构建,偶尔会因为环境问题导致元数据读取异常;而wheel包是预构建的,元数据更稳定可靠。
重新打包并上传:
# 先安装构建工具 pip install build # 同时构建源码包和wheel包 python -m build # 用twine或你们内部的工具上传到仓库 twine upload --repository-url <你的内部仓库地址> dist/*
之后用pip安装这个wheel包,大概率能自动拉取依赖。
4. 升级pip到最新版本
旧版本的pip对setuptools的字段支持可能有bug,先升级pip:
pip install --upgrade pip
再重新安装你的包试试。
5. 验证包的元数据是否包含依赖
你可以下载包到本地,检查它的元数据里有没有paramiko:
# 下载包到当前目录(不安装依赖) pip download mypackage --index-url <你的内部仓库地址> --no-deps # 如果是wheel包,查看元数据 unzip -p mypackage-*.whl mypackage.dist-info/METADATA | grep -A 10 "Requires-Dist" # 如果是源码包,解压后查看PKG-INFO tar xzf mypackage-*.tar.gz cat mypackage-*/PKG-INFO | grep -A 10 "Requires-Dist"
如果这里看不到paramiko的依赖项,说明打包阶段确实没把依赖加进去,回到前面的步骤排查setup.py的问题。
内容的提问来源于stack exchange,提问作者blueFast




