如果你想私有部署 pip 包,也就是说,不发布到 PyPI,而是自己内部使用,有几种方式可以实现。下面是常见的做法和适合的场景:
🧩 方法一:直接通过本地路径或文件安装(开发/测试最简单)
✅ 场景:自己或团队内本地使用
操作:
打包你的包:
python -m build
然后安装:
pip install dist/your_package_name-0.1.0-py3-none-any.whl
也可以不打包,直接安装源码目录:
pip install .
或:
pip install -e . # 开发模式(修改源码立即生效)
🌐 方法二:通过私有 Git 仓库安装
✅ 场景:你在 GitHub / GitLab / 公司 Git 服务器有项目仓库
操作:
pip install git+https://your.git.server/youruser/yourrepo.git@main
如果项目结构不是标准结构,还可以加子目录:
pip install git+https://...git@main#egg=yourpkg&subdirectory=subdir
如果 Git 仓库是私有的,可以:
- 用带 token 的 URL(不安全,但能用)
- 配置
.netrc
或ssh
📦 方法三:搭建私有 PyPI 服务器
✅ 场景:你有公司内部部署需求(最标准、可控)
选项 A:使用 pypiserver
简单搭建:
pip install pypiserver
mkdir -p ~/packages
pypi-server run -p 8080 ~/packages
上传你的包(.whl
或 .tar.gz
)到 ~/packages/
安装时:
pip install your-package --extra-index-url http://your-server:8080/simple
选项 B:更强的工具(支持权限控制)
这些适合企业级部署。
🔐 方法四:本地文件服务器或 Web 服务器作为 index
如果你只是想在局域网里分发,也可以把 .whl
文件放在某个目录或服务器上,并生成一个简单的 index 页面:
python -m http.server 8000
访问 http://localhost:8000/
,然后:
pip install your-package --extra-index-url http://localhost:8000
必须在目录下有个简单的 simple/index.html
结构,或者你使用 --find-links
:
pip install --find-links=http://localhost:8000 your-package
📝 总结
方式 | 适合场景 | 安装方式 | 安全性/灵活性 |
---|---|---|---|
本地安装 | 本地测试、开发 | pip install . 或 .whl |
最简单 |
Git 安装 | 团队共享、CI/CD | pip install git+... |
安全性视 Git 认证 |
私有 PyPI | 企业内部 | --extra-index-url |
标准、可控、推荐 |
文件服务器 | 快速共享 | --find-links |
快捷、不推荐长期使用 |
需要我帮你搭一个最小可运行的私有 pip 包部署例子吗?例如:git+本地仓库
或 pypiserver
模拟部署。
你说的应该是:pyproject.toml
、setup.cfg
等打包配置文件是否需要手动编写,还是可以通过工具自动生成。
答案是:
✅ 有工具可以帮助你自动生成 pyproject.toml
(或旧版的 setup.py
)
以下是几种推荐工具:
🛠️ 方法一:使用 [hatch
](现代推荐,官方支持)
安装:
pip install hatch
创建新项目:
hatch new myproject
这会自动生成:
myproject/
├── myproject/
│ └── __init__.py
├── tests/
│ └── __init__.py
├── pyproject.toml ✅ ✅ ✅
└── README.md
pyproject.toml
结构清晰,支持 CLI 脚本声明,非常适合现代项目。
🛠️ 方法二:使用 [flit
](适合纯 Python 包)
安装:
pip install flit
初始化:
flit init
它会问你一些问题,然后生成一个 pyproject.toml
文件,比如:
[project]
name = "your-package"
authors = [{name = "Your Name", email = "you@example.com"}]
version = "0.1.0"
description = ""
readme = "README.md"
requires-python = ">=3.8"
dependencies = []
[project.scripts]
your-command = "your_module:main"
然后你只需运行:
flit install
🛠️ 方法三:setuptools
(手动多,但通用)
初始化项目:
pip install setuptools
你可以手动写 pyproject.toml
或使用模板生成器(如 cookiecutter)初始化项目。
✅ 总结
工具 | 是否生成 pyproject.toml |
是否支持 CLI 安装 | 推荐指数 |
---|---|---|---|
Hatch | ✅ 是 | ✅ 是 | ⭐⭐⭐⭐⭐ |
Flit | ✅ 是 | ✅ 是 | ⭐⭐⭐⭐ |
Setuptools | ✅ 是(较繁琐) | ✅ 是 | ⭐⭐⭐ |
My python util collections
我的个人python工具集,模块构建流程:
项目结构
├── README.md
├── pyproject.toml
├── src
│ └── pyutils
│ ├── __init__.py
│ ├── base_sqlite_db.py
│ ├── my_log.py
│ ├── utils.py
│ └── zip.py
└── tests
└── test.py
Module模块构建
-
1、示例(使用 setuptools):
#在pyproject.toml文件 [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-package-name" version = "0.1.0" description = "简短描述" readme = "README.md" requires-python = ">=3.7" license = {text = "MIT"} authors = [ {name = "你的名字", email = "你@邮箱.com"} ] dependencies = [ "requests>=2.0", # 依赖示例 ] [project.urls] Homepage = "https://github.com/yourname/yourproject"
-
2、构建包
- 先安装打包工具(一次性操作):
pip install build
- 然后在项目根目录运行:
python -m build
- 会生成:
dist/ ├── your_package_name-0.1.0.tar.gz └── your_package_name-0.1.0-py3-none-any.whl
- 先安装打包工具(一次性操作):
上传到 PyPI
安装上传工具:
pip install twine
注册并获取 PyPI 账号
上传:
twine upload dist/*
输入你的 PyPI 用户名和密码即可。
💡 最新版本twine可能是OIDC 的API token,在pypi的个人账号下创建 API token,
并在~/.pypirc
本地保存配置,可以长期免输入token使用:
[distutils]
index-servers =
pypi
[pypi]
repository= https://upload.pypi.org/legacy/ #上传地址
username = __token__ #验证类型
password = #输入你的token pypi-AgEIcHlwaS5.....
💡 建议先上传到测试环境 Test PyPI:
💡 Because TestPyPI has a separate database from the live PyPI, you’ll need a separate user account specifically for TestPyPI. Go to https://test.pypi.org/account/register/ to register your account.
twine upload --repository testpypi dist/*
在其他项目中安装
pip install your-package-name
或者从 Test PyPI:
pip install --index-url https://test.pypi.org/simple/ your-package-name