我回来了
什么是pip
pip
,即 Pip Installs Packages 的缩写,是 Python 的包管理器,用于安装和管理 Python 包。我们可以使用pip install package
安装对应的包。
这些包的默认来源,是PyPI(Python Package Index),是一个由 Python 社区维护的官方软件包仓库。开发者们可以将自己开发的 Python 包上传到 PyPI,供其他人下载和使用。我们常用的requests
、Pillow
等仓库,就是由相应项目的开发者维护并上传到Pypi的。
如果你在Python中实现了一些不错的功能,并且想分享给更多人使用,那么可以将你的包上传到PyPI。
Python中的包(Package)
Python的包(package)是一个文件夹,其中包含一个__init__.py
文件和若干个其他文件和文件夹。__init__.py
文件可以是一个空文件,也可以包含初始化代码。
Python的包中可以包含其他py文件作为模块(module),也可以包含其他的包文件夹。
以下是一个简单的Python包示例
my_package
├─my_subpackage
│ └─__init__.py
├─__init__.py
└─my_submodule.py
这个package的包名就是my_package
,你可以通过import my_package
导入这个包,或者通过from my_package import my_submodule
引入子模块(或这个包中的任意对象)。
创建一个Python包项目
目录结构
program
├─my_package
│ ├─my_subpackage
│ │ └─__init__.py
│ ├─__init__.py
│ └─my_submodule.py
├─readme.md
└─setup.py
你需要新建一个自述文件(非必须,但是推荐。其中可以介绍你的项目),还有一个setup.py
文件,用于打包项目。
以下是setup.py
文件的模板。
import setuptools
import shutil
# 删除dist/目录
shutil.rmtree('dist', ignore_errors=True)
setuptools.setup(
name="your_package_name",
version="0.0.1",
author="your_name",
author_email="[email protected]",
description="A brief introduction to the project",
install_requires=[], # 如果有第三方依赖可以在此列出
long_description=open(r'readme.md', encoding='utf-8').read(), # 读取readme自述文件
long_description_content_type="text/markdown",
url="https://github.com/my_name/my_repo", # 你的项目主页,一般是GitHub仓库,其他URL也可以
packages=setuptools.find_packages(), # 自动列出项目下的包
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License", # 开源许可证
"Operating System :: OS Independent", # 这里的定义是系统无关(全平台兼容),如果你的包只能在部分特定系统上运行,需要修改。
],
)
另外,name="your_package_name",
对应的是仓库名,也就是pip install xxx
使用的那个名字,它可以和包的名字不同,但一定要独一无二。你可以在https://pypi.org/上搜索是否重名。
比如你的模块文件夹叫package
,而仓库名是my_first_package
,那么当这个包成功上传后,你应该使用pip install my_first_package
安装这个包,然后使用import package
引入它。
打包项目
python setup.py sdist bdist_wheel
使用此命令打包项目,dist/
目录下会出现对应版本的压缩包或whl文件。接下来你就可以上传对应的包。
上传项目
在testPyPI上测试
创建账号和Token
https://test.pypi.org/ 用于在正式上传之前对你的上传流程进行测试。testPyPI上的管理员会定期清理上传的包,因此请仅用于临时测试。
在https://test.pypi.org/上注册一个账户,并配置2FA验证。
在https://test.pypi.org/manage/account/token/上,新建一个API key,并将其保管好,它只会显示一次。
记得保存好创建的token
上传你的包
python -m twine upload --repository testpypi dist/*
在上传过程中,你需要输入刚才创建的token,可以直接粘贴。(如果你没有保存,那么麻烦重新创建一个)
等待完成,你可以在https://test.pypi.org/manage/projects/上查看你的包是否已经上传了。
并且可以用此命令测试包的安装
pip install --index-url https://test.pypi.org/simple/ --no-deps your_package_name
正式上传
当一切准备妥当,你就可以正式地向pypi上传自己的包了。
你需要按照上述的流程,在https://pypi.org/上创建一个账号并在https://pypi.org/manage/account/token/新建token。它与TestPyPI上的账号和token不互通。
使用以下命令将你的包上传到PyPI
python -m twine upload dist/*
等待完成,在https://pypi.org/manage/projects/上查看你的包是否已经上传了。
安装你上传的包
pip install your_package_name
如果你的pip定义了镜像源,那么你的包不一定能够第一时间被同步。清华大学的TUNA镜像站同步速度比较快。