搞定了。你写了个绝妙的Python小工具,或者一个牛逼哄哄的算法实现。它在你自己的电脑上运行如飞,你给同事炫耀,他们都说“哇塞”。然后呢?
然后,一股冲动就在你心里挠,痒痒的。你想让全世界的Python开发者,都能在他们的终端里,优雅地敲下 pip install your-awesome-package
。就这一行,你的代码,你的心血,就流淌到了别人的项目里。
这感觉,想想都带劲。
所以,python怎么上库?这事儿听起来高大上,好像是那些开源大佬的专属游戏。其实啊,捅破那层窗户纸,你会发现,它就是一套流程,一套有点繁琐但绝对不神秘的流程。跟我来,我带你走一遍,保证你也能把自己的“亲儿子”送到PyPI这个大舞台上。
一、准备工作:不打无准备之仗
在你急着敲命令之前,先冷静一下,泡杯茶。咱们得先做点思想建设和环境准备。这步要是跳了,后面有的是坑等着你。
首先,也是最重要的:给你的包起个名。这名字必须是PyPI上独一无二的。你可以在PyPI官网(pypi.org)上搜一下,看看你的心头好是不是被人占了。别起那种 test
、example
这种烂大街的名字,百分之百被占了,而且显得你很业余。起个有创意、能表达你包功能的名字。这是你的门面。
其次,整理你的项目结构。别把所有 .py
文件都扔在根目录。像个正经项目一样,给它建个结构。最起码的,像这样:
your-awesome-package/
├── your_package_name/
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py
├── tests/
│ ├── test_module1.py
│ └── ...
├── .gitignore
├── LICENSE
├── README.md
└── pyproject.toml (或者老派的 setup.py)
看到没?源码放在一个同名的子目录里,README.md
写好,LICENSE
授权文件也得有(比如MIT,Apache 2.0,选一个你喜欢的)。这不光是为了“上库”,这是良好编程习惯的一部分。README尤其重要,这是别人了解你项目的唯一窗口,是你未来在PyPI上的“商品详情页”,务必用心写。
二、灵魂文件:pyproject.toml
的自白
过去,我们都用 setup.py
。现在,时代变了,官方更推荐使用 pyproject.toml
。这玩意儿更现代,更规范。我们就用新的。
pyproject.toml
是你这个包的“身份证”和“说明书”。它告诉Python的打包工具,你这个包叫什么、版本多少、谁写的、需要哪些依赖、怎么打包等等一切信息。
打开你的编辑器,在项目根目录创建 pyproject.toml
,然后把下面这些“咒语”填进去:
“`toml
[build-system]
requires = [“setuptools>=61.0”]
build-backend = “setuptools.build_meta”
[project]
name = “your-awesome-package” # 换成你独一无二的包名
version = “0.0.1” # 重要的版本号!
authors = [
{ name=”Your Name”, email=”you@example.com” },
]
description = “A small but awesome package that does X, Y, and Z.” # 一句话简介
readme = “README.md” # 告诉它去读哪个文件当详细介绍
requires-python = “>=3.7” # 你的代码要求什么版本的Python?
classifiers = [
“Programming Language :: Python :: 3”,
“License :: OSI Approved :: MIT License”,
“Operating System :: OS Independent”,
]
dependencies = [
“requests>=2.20.0”, # 你的包依赖了哪些其他的包?写在这里
“numpy”,
]
[project.urls]
“Homepage” = “https://github.com/your-username/your-awesome-package”
“Bug Tracker” = “https://github.com/your-username/your-awesome-package/issues”
“`
这里面每一项都得琢磨琢磨。
name
: 就是你在PyPI上的名字,必须唯一。version
: 版本号是命根子。每次更新,你都得改这个版本号才能上传成功。我建议你了解一下“语义化版本”(Semantic Versioning),就是主版本号.次版本号.修订号
这种格式。比如1.2.3
。第一次上传,就用0.0.1
,挺好。dependencies
: 这是个大头。你的代码里import
了哪些第三方库?requests
?pandas
?numpy
? 全都老老实实写在这里。这样别人pip install
你的时候,会自动把这些依赖也装上。别坑人。
三、打包!把你的代码变成“快递包裹”
身份证办好了,接下来就是把你这一堆代码文件,打成一个标准的“发行版”压缩包。别人 pip install
的,就是这个压缩包。
我们需要两个工具:build
和 twine
。
bash
pip install --upgrade build twine
装好之后,在你的项目根目录(就是 pyproject.toml
所在的地方)打开终端,然后,深吸一口气,敲下这行命令:
bash
python -m build
回车。你会看到终端里刷刷刷地输出一堆信息。别慌,它正在辛勤地工作。如果一切顺利,最后你会看到类似 Successfully built ...
的字样。
这时候,你再看看你的项目目录,会发现多了两个新东西:一个叫 build
的文件夹,还有一个叫 dist
的文件夹。
dist
文件夹,就是你的目的地!打开它,你会看到两个文件,大概长这样:
* your_awesome_package-0.0.1-py3-none-any.whl
* your_awesome_package-0.0.1.tar.gz
whl
文件是 “Wheel” 格式,是预编译的包,安装起来飞快,是现在的首选。.tar.gz
是源码包,是兜底用的。这两个,就是我们准备寄出去的“快递包裹”。
四、终极一步:发射到PyPI
万事俱备,只欠发射。
首先,你得有个 PyPI 的账号。去 pypi.org 注册一个。记住你的用户名和密码。
但,直接往正式的PyPI上怼,万一搞砸了,留个垃圾项目在那儿,多尴尬。所以,大佬们准备了一个“演练场”:TestPyPI (test.pypi.org)。我们可以先把包发到这上面,测试一下流程对不对,安装有没有问题。
去 test.pypi.org 也注册一个账号。注意,这和主站的账号不通用,得单独注册。
注册好之后,是时候请出我们的上传工具 twine
了。
打开终端,还是在你的项目根目录,敲下面的命令,先上传到TestPyPI试试水:
bash
twine upload --repository testpypi dist/*
回车后,它会提示你输入用户名和密码。就输入你在 TestPyPI 注册的那个。
现在更推荐用API Token,更安全。你可以在TestPyPI网站的账户设置里生成一个。那样的话,用户名输入 __token__
,密码就粘贴你生成的那个长长的token。
如果一切顺利,你会看到进度条,然后是你的包在TestPyPI上的URL。成功了!
你可以打开那个URL看看。甚至可以试试用pip从测试服务器安装它:
bash
pip install --index-url https://test.pypi.org/simple/ your-awesome-package
如果能装上,能用。恭喜你,演练成功!
现在,是时候来真的了。向全世界发布。
命令几乎一模一样,只是去掉了 --repository testpypi
这个参数,让它默认上传到主站:
bash
twine upload dist/*
同样,输入你在主站PyPI的用户名和密码(或者token)。
当终端再次显示上传成功时,整个世界都安静了。
去 pypi.org
搜你的包名,它就在那儿了。静静地躺在那儿,等着第一个 pip install
。
从现在开始,任何一个能上网的Python开发者,都能通过一行命令,使用你的代码了。
是不是感觉自己的人生都升华了?
尾声:然后呢?
发布只是开始。如果有人用了你的包,提了bug,或者你有了新功能,你就需要更新它。流程很简单:
- 修改你的代码。
- 修改
pyproject.toml
里的version
版本号! 比如从0.0.1
升级到0.0.2
或者0.1.0
。这是必须的,否则PyPI会拒绝你上传同版本的包。 - 删掉旧的
dist
文件夹。 - 重新运行
python -m build
。 - 重新运行
twine upload dist/*
。
如此循环往复。你的开源项目,就这样维护起来了。
“python怎么上库”这个问题的答案,其实就是这样一套手艺活。它不难,但它充满了仪式感。它把你从一个代码的使用者,变成了代码的创造者和分享者。
这趟旅程,值得你走一次。去吧,你的 pip install ...
在等着你。
评论(0)