前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打包一个Python库(PyPa)

打包一个Python库(PyPa)

作者头像
云深无际
发布2021-12-01 22:13:45
9650
发布2021-12-01 22:13:45
举报
文章被收录于专栏:云深之无迹

本文的写作环境,喜欢这种黑暗+昏暗的灯光

缘起~为什么会有这样的一篇文章呢?因为我最近在读Python的官方文档,里面正好读到了这里安装Python模块,然后我天天也在读源码,也在实践中得到了一些佐证。所以记录一下。

这一切是一个组织在维护:

代码语言:javascript
复制
https://www.pypa.io/en/latest/

Python Packaging Authority (PyPA) 是一个工作组,负责维护 Python 打包中使用的一组核心软件项目。

这里我找一个库作为说明:

代码语言:javascript
复制
https://github.com/3b1b/manim

使用这个

代码语言:javascript
复制
https://docs.manim.org.cn/
代码语言:javascript
复制
https://3b1b.github.io/manim/

然后解压,看到这些,今天就说这些

这里是打印Python的版本

代码语言:javascript
复制
https://packaging.python.org/

关于我这篇文章的参考位置

代码语言:javascript
复制
py -m pip --version

pip 21.3.1 from C:\Users\yunswj\AppData\Local\Programs\Python\Python36\lib\site-packages\pip (python 3.6)

打印PIP的版本。

代码语言:javascript
复制
https://packaging.python.org/tutorials/packaging-projects/

看这个

代码语言:javascript
复制
https://pip.pypa.io/en/stable/
代码语言:javascript
复制
https://setuptools.pypa.io/en/latest/
代码语言:javascript
复制
py -m pip install --upgrade pip

pip的源文件样子

代码语言:javascript
复制
packaging_tutorial/
└── src/
    └── example_package/
        ├── __init__.py
        └── example.py

未来写库应该写的是这样的

我们创建一个

pyproject.toml告诉构建工具(如pip和build)构建项目需要什么。

给出要构建包的依赖包

我们的manim,这里也有写法

配置元数据

有两种类型的元数据:静态和动态。

  • 静态元数据 ( setup.cfg):保证每次都相同。这更简单、更易于阅读,并避免了许多常见错误,例如编码错误。
  • 动态元数据 ( setup.py):可能是不确定的。任何动态的或在安装时确定的项目,以及扩展模块或 setuptools 的扩展,都需要进入setup.py.

setup.cfg应首选静态元数据 ( )。动态元数据 ( setup.py) 应仅在绝对必要时用作逃生舱口。setup.py过去是必需的,但在较新版本的 setuptools 和 pip 中可以省略。

这个是demo的例子:

代码语言:javascript
复制
[metadata]
name = example-pkg-YOUR-USERNAME-HERE
version = 0.0.1
author = Example Author
author_email = author@example.com
description = A small example package
long_description = file: README.md
long_description_content_type = text/markdown
url = https://github.com/pypa/sampleproject
project_urls =
    Bug Tracker = https://github.com/pypa/sampleproject/issues
classifiers =
    Programming Language :: Python :: 3
    License :: OSI Approved :: MIT License
    Operating System :: OS Independent

[options]
package_dir =
    = src
packages = find:
python_requires = >=3.6

[options.packages.find]
where = src

setuptools的例子:

代码语言:javascript
复制
[metadata]
name = my_package
version = attr: src.VERSION
description = My package description
long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
keywords = one, two
license = BSD 3-Clause License
classifiers =
    Framework :: Django
    License :: OSI Approved :: BSD License
    Programming Language :: Python :: 3
    Programming Language :: Python :: 3.5

[options]
zip_safe = False
include_package_data = True
packages = find:
scripts =
    bin/first.py
    bin/second.py
install_requires =
    requests
    importlib; python_version == "2.6"

[options.package_data]
* = *.txt, *.rst
hello = *.msg

[options.entry_points]
console_scripts =
    executable-name = package.module:function

[options.extras_require]
pdf = ReportLab>=1.2; RXP
rest = docutils>=0.3; pack ==1.1, ==1.3

[options.packages.find]
exclude =
    src.subpackage1
    src.subpackage2

相当于教科书级别的写法了

把我们的元文件复制进来

代码语言:javascript
复制
https://setuptools.pypa.io/en/latest/userguide/declarative_config.html

这个是语法,是和win ini文件一样的配置文件

支持的 INI 文件结构

配置文件由部分组成,每个部分由一个[section]标题引导,后跟由特定字符串(=:默认情况下为1)分隔的键/值条目。默认情况下,部分名称区分大小写,但键不是 1。从键和值中删除前导和尾随空格。如果解析器配置为允许它1,则可以省略值,在这种情况下,键/值分隔符也可以省略。值也可以跨越多行,只要它们比值的第一行缩进得更深。根据解析器的模式,空行可能被视为多行值的一部分或被忽略。

大概就是这样的一个情况

代码语言:javascript
复制
https://pypa-build.readthedocs.io/en/stable/index.html

构建工具的地址

执行后报错,我查了一下,应该是在虚拟环境构建

代码语言:javascript
复制
https://packaging.python.org/tutorials/installing-packages/#creating-virtual-environments

在这篇里面有论述

代码语言:javascript
复制
python.exe -m venv C:\Users\yunswj\Desktop\tf   

但是我不会用

代码语言:javascript
复制
pip install virtualenv

先安装这个工具

代码语言:javascript
复制
python3 -m venv .

在当前环境建立一个虚拟环境

然后激活一下

新环境就两个包

代码语言:javascript
复制
py -m pip install --upgrade build

安装构建工具

代码语言:javascript
复制
py -m build

我构建失败了

取消激活环境,删除就行

代码语言:javascript
复制
https://zhuanlan.zhihu.com/p/42561895
参考文章

在当前目录创建虚拟环境

代码语言:javascript
复制
$ python3 -m venv .

在当前目录创建独立的python环境

代码语言:javascript
复制
$ virtualenv --no-site-packages venv

激活虚拟环境

代码语言:javascript
复制
$ source venv/bin/activate

停用虚拟环境

代码语言:javascript
复制
$ deactivate

删除虚拟环境

代码语言:javascript
复制
$ rm -rf venv

操,一到动手,一堆错误,mb。。。你就当我构建成功了。

一般这样的目录就是一个不错的包

一个好的包一定少不了一个文档,那下面就安装一下

代码语言:javascript
复制
py -m pip install -U sphinx

安装好以后

代码语言:javascript
复制
 sphinx-quickstart

执行这个

按照提示摁

构建

就构建出来了

代码语言:javascript
复制
https://docs.readthedocs.io/en/latest/intro/import-guide.html

这里有更多的细节

注意的是venv才是最新的构建方式

如果你执行的话,会有让你选择解释器的选项

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置元数据
  • 支持的 INI 文件结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档