非PyPI私有Python包依赖的安装最佳实践及跨平台实现问询
解决方案:将私有Python包嵌入主包并实现自动安装
我来给你几个靠谱的方案,都能兼容Windows和Linux,让你在安装主包时自动装上那个未托管在PyPI的私有依赖:
方案一:直接嵌入私有包源码,通过主包依赖配置自动安装
这是最直接的方式,把私有包的完整源码放到主包的某个子目录,然后通过主包的构建配置告诉pip去安装它。
步骤:
- 整理目录结构:把私有包的源码放到主包的
vendor目录下(名字可以自己定),最终结构大概是这样:my_main_pkg/ ├── pyproject.toml # 主包的构建配置文件 ├── my_main_pkg/ │ ├── __init__.py │ └── your_code.py └── vendor/ └── my_private_pkg/ ├── pyproject.toml # 私有包自己的构建配置 └── my_private_pkg/ ├── __init__.py └── private_code.py - 配置主包的依赖:在主包的
pyproject.toml里,添加对私有包的本地路径依赖。示例配置:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_main_pkg" version = "0.1.0" dependencies = [ "./vendor/my_private_pkg", # 这里指定私有包的相对路径 # 其他PyPI依赖写在这里,比如 "requests>=2.25.1" ] - 安装验证:不管是执行
pip install .安装本地主包,还是把主包上传到PyPI后执行pip install my_main_pkg,pip都会自动找到并安装vendor目录下的私有包。
方案二:用Git子模块管理私有包(适合私有包在Git仓库的场景)
如果你的私有包本身托管在私有Git仓库(比如GitLab、GitHub私有库),用Git子模块可以更方便地同步私有包的版本,同时依然能让pip自动安装。
步骤:
- 添加子模块:在主包的根目录执行命令,把私有包拉到
vendor目录:git submodule add https://your-private-git-repo-url/my_private_pkg.git vendor/my_private_pkg - 提交子模块配置:把
.gitmodules文件和子模块目录提交到主包的Git仓库,这样其他人克隆主包时,可以通过git submodule update --init --recursive拉取私有包的源码。 - 配置主包依赖:和方案一一样,在主包的
pyproject.toml里添加"./vendor/my_private_pkg"作为依赖即可。
方案三:预构建私有包为Wheel,嵌入主包(轻量化选项)
如果不想把私有包的全部源码放进主包,可以先把私有包构建成Wheel文件,然后把Wheel文件嵌入主包,pip同样能识别并安装。
步骤:
- 构建私有包Wheel:在私有包的根目录执行命令生成Wheel文件:
执行完后,会在python -m build --wheeldist目录下生成类似my_private_pkg-1.0.0-py3-none-any.whl的文件。 - 存放Wheel文件:把生成的Wheel文件放到主包的
assets/wheels目录下。 - 配置主包依赖:在主包的
pyproject.toml里指定Wheel文件的路径:[project] dependencies = [ "./assets/wheels/my_private_pkg-1.0.0-py3-none-any.whl", # 其他依赖... ]
注意事项
- 不管用哪种方案,都要确保私有包本身的构建配置(
pyproject.toml或setup.py)是规范的,能被pip正常安装。 - 如果私有包还有自己的依赖,要么确保这些依赖在PyPI上,要么用同样的方式把它们也嵌入主包。
- 不建议直接把私有包源码放到主包的源码目录然后修改
sys.path导入,这种方式容易出现导入路径冲突,也不符合Python包的规范。
内容的提问来源于stack exchange,提问作者Elrond
相关产品推荐
相关产品推荐

