Python代码打包成pip包(可pip install)|查看安装torch、cuda和cudnn版本号 |
文章目录
- 一. pip包的好处
- 二. 简单小例子
- 2.1. 创建Python包
- 2.2. 构建Python包
- 2.3. 上传到PyPI
- 2.4. pip安装测试
- 三. CLIP多模态模型相关例子
- 3.1. Chinese-CLIP例子
- 3.2. CLIP-ONNX例子
- 3.3. 问题1和问题2
- 四. 查看安装torch、cuda和cudnn版本号
- 参考文章
一. pip包的好处
将
Python
代码打包成可以通过pip install
安装的包有很多好处,包括:
- 便于分发:你可以将你的 Python 代码上传到
PyPI(Python Package Index)
,这样其他人可以很容易地使用pip install
来安装和使用你的代码。- 版本控制:你可以为你的包定义版本号,这样用户可以选择安装特定版本的包,或者升级到新的版本。
- 便于依赖管理:如果你的代码依赖于其他的
Python
包,你可以在你的包的setup.py
文件中指定这些依赖,这样当用户安装你的包时,这些依赖也会被自动安装。- 提供元数据:你可以在
setup.py
文件中提供你的包的元数据,包括包的名称、版本、作者、描述等信息,这些信息可以帮助用户了解你的包。- 创建命名空间:通过将代码打包,你可以创建一个独立的命名空间,避免与其他代码的命名冲突。
- 符合 Python 社区标准:将代码打包并发布到
PyPI
是Python
社区的标准做法,这样可以让你的代码更容易被其他Python
用户接受和使用。
二. 简单小例子
2.1. 创建Python包
- 创建一个Python包。对于一个Python包来说,通常有一个包含
__init__.py
文件的目录。这个目录中放置着包所需的Python模块和其他文件。假设你的包名为my_package,那么目录结构可能如下:
.
├── hellodemo123
│ ├── data
│ │ └── test.txt
│ ├── hello.py
│ └── __init__.py
├── main.py
└── setup.py
- 其中
my_package
是你的包的名称,my_module.py
是你的 Python 代码文件(模块)。__init__.py
是一个空文件,它告诉Python my_package
是一个包
- 在
my_module.py
中,我们定义一个简单的函数:
def say_hello(name):
print(f"Hello, {name}!")
- 在
setup.py
文件中,我们定义包的元数据:
# !/usr/bin/env python
# -*- encoding: utf-8 -*-
"""=====================================
@author : kf.zhang
@time : 2023/7/21 12:42
@contact: devinzhang1994@163.com
@desc :
====================================="""
from setuptools import setup, find_packages
setup(
name='hellodemo123', # 包的名称
version='0.1.0', # 包的版本
author='ZhangKaifang', # 你的名字
author_email='devinzhang1994@163.com', # 你的邮箱
description='A brief description of the package',
packages=find_packages(), # 系统自动从当前目录开始找包
# packages=['hello', '__init__'], # 指定目录中需要打包的py文件,注意不要.py后缀
package_data={'hellodemo123': ['data/*.txt']},
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
],
python_requires='>=3.6',
license="apache 3.0"
)
"""
name : 打包后包的文件名
version : 版本号
author : 作者
author_email : 作者的邮箱
py_modules : 要打包的.py文件
packages: 打包的python文件夹
include_package_data : 项目里会有一些非py文件,比如html和js等,这时候就要靠include_package_data 和 package_data 来指定了。package_data:一般写成{‘your_package_name’: [“files”]}, include_package_data还没完,还需要修改MANIFEST.in文件.MANIFEST.in文件的语法为: include xxx/xxx/xxx/.ini/(所有以.ini结尾的文件,也可以直接指定文件名)
license : 支持的开源协议
description : 对项目简短的一个形容
ext_modules : 是一个包含Extension实例的列表,Extension的定义也有一些参数。
ext_package : 定义extension的相对路径
requires : 定义依赖哪些模块
provides : 定义可以为哪些模块提供依赖
data_files :指定其他的一些文件(如配置文件),规定了哪些文件被安装到哪些目录中。如果目录名是相对路径,则是相对于sys.prefix或sys.exec_prefix的路径。如果没有提供模板,会被添加到MANIFEST文件中。
"""
2.2. 构建Python包
- 在项目的根目录下运行以下命令来构建你的包:
python setup.py sdist bdist_wheel
- 这个命令包含两部分:sdist 和 bdist_wheel。
sdist
:这是源代码分发的缩写。它创建一个源代码分发包,包含了项目的所有源代码文件(例如:.py 文件)。这种分发包允许最终用户自己编译和安装软件,通常是一个.tar.gz(在 Unix 系统)
或.zip(在 Windows 系统)
文件。bdist_wheel
:这是二进制分发的缩写,具体的格式是 Wheel。Wheel 是一个二进制包格式,它预编译了Python
代码,使得安装更快且不需要用户本地环境中有编译依赖。Wheel 分发包通常是 .whl 文件。- 在大多数情况下,如果用户环境中安装了适当的
Python
和pip
版本,推荐使用 Wheel 分发包(.whl
文件),因为它们通常更容易安装,而且安装速度更快。执行python setup.py sdist bdist_wheel
后,你的源码包和二进制包将会在 dist/ 目录下生成。为了使用 bdist_wheel 命令,你需要确保已经安装了 wheel 库。如果没有,可以使用pip install wheel
来安装。最后,请注意,从Python 3.10
开始,官方推荐使用新的构建工具build
替代setup.py
。你可以使用pip install build
来安装它,然后用python -m build
命令来构建你的项目。
.
├── build
│ ├── bdist.linux-x86_64
│ └── lib
│ └── hellodemo123
│ ├── data
│ │ └── test.txt
│ ├── hello.py
│ └── __init__.py
├── dist
│ ├── hellodemo123-0.1.0-py3-none-any.whl
│ └── hellodemo123-0.1.0.tar.gz
├── hellodemo123
│ ├── data
│ │ └── test.txt
│ ├── hello.py
│ └── __init__.py
├── hellodemo123.egg-info
│ ├── dependency_links.txt
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ └── top_level.txt
├── main.py
└── setup.py
2.3. 上传到PyPI
- 使用
twine
工具来发布你的包到PyPI
。首先,你需要安装 twine:
pip install twine
#运行以下命令来发布你的包:
twine upload dist/*
- 在这个过程中,
twine
会提示你输入你在PyPI
上的用户名和密码。输入正确的用户名和密码后,你的包就会被上传到PyPI
,并且可以通过pip install
来安装了。
- 注意,以上过程中的包名、作者名、邮箱、URL 等信息需要你根据实际情况进行修改。发布到
PyPI
时,包名需要是唯一的,不能和PyPI
上已有的包名重复。如果你只是想在本地测试,你也可以不上传到PyPI
,直接使用pip install dist/zkf_package-0.1-py3-none-any.whl
来安装你的包。
2.4. pip安装测试
三. CLIP多模态模型相关例子
3.1. Chinese-CLIP例子
- Github链接:Chinese-CLIP github链接
- 代码结构
.
├── cn_clip
│ ├── clip
│ │ ├── bert_tokenizer.py
│ │ ├── configuration_bert.py
│ │ ├── __init__.py
│ │ ├── model_configs
│ │ │ ├── RBT3-chinese.json
│ │ │ ├── RN50.json
│ │ │ ├── RoBERTa-wwm-ext-base-chinese.json
│ │ │ ├── RoBERTa-wwm-ext-large-chinese.json
│ │ │ ├── ViT-B-16.json
│ │ │ ├── ViT-B-32.json
│ │ │ ├── ViT-H-14.json
│ │ │ ├── ViT-L-14-336.json
│ │ │ └── ViT-L-14.json
│ │ ├── modeling_bert.py
│ │ ├── model.py
│ │ ├── __pycache__
│ │ │ ├── bert_tokenizer.cpython-37.pyc
│ │ │ ├── configuration_bert.cpython-37.pyc
│ │ │ ├── __init__.cpython-37.pyc
│ │ │ ├── model.cpython-37.pyc
│ │ │ ├── modeling_bert.cpython-37.pyc
│ │ │ └── utils.cpython-37.pyc
│ │ ├── utils.py
│ │ └── vocab.txt
│ ├── deploy
│ │ ├── benchmark_utils.py
│ │ ├── __init__.py
│ │ ├── onnx_to_tensorrt.py
│ │ ├── pytorch_to_onnx.py
│ │ ├── speed_benchmark.py
│ │ └── tensorrt_utils.py
│ ├── eval
│ │ ├── cvinw_zeroshot_templates.py
│ │ ├── data.py
│ │ ├── evaluation.py
│ │ ├── evaluation_tr.py
│ │ ├── extract_features_onnx.py
│ │ ├── extract_features.py
│ │ ├── extract_features_tensorrt.py
│ │ ├── imagenet_zeroshot_templates.py
│ │ ├── __init__.py
│ │ ├── make_topk_predictions.py
│ │ ├── make_topk_predictions_tr.py
│ │ ├── transform_ir_annotation_to_tr.py
│ │ └── zeroshot_evaluation.py
│ ├── __init__.py
│ ├── preprocess
│ │ ├── build_lmdb_dataset.py
│ │ ├── __init__.py
│ │ └── transform_openai_pretrain_weights.py
│ ├── __pycache__
│ │ └── __init__.cpython-37.pyc
│ └── training
│ ├── data.py
│ ├── __init__.py
│ ├── logger.py
│ ├── main.py
│ ├── params.py
│ ├── scheduler.py
│ └── train.py
├── setup.py
# ---------------------- 其中__init__.py文件内容为空
- setup.py文件
import os
# os 库提供了一些用于操作操作系统的功能,如读取环境变量,处理文件和目录等。
import pkg_resources
# pkg_resources 是 setuptools 库的一部分,它提供了一些用于处理 Python 包资源的工具。
from setuptools import setup, find_packages
# setup 和 find_packages 是 setuptools 库中的函数。
# setup 用于设置包的元数据和安装选项。
# find_packages 用于自动找到包中的所有模块和子包。
packages = find_packages(exclude=["tests*"])
# 自动找到所有的模块和子包,但是排除名字以 "tests" 开头的包。
with open('README_En.md', 'r', encoding='utf-8') as fp:
long_description = fp.read()
# 读取 README 文件的内容,并将其存储在 long_description 变量中。
setup(
# 这是 setup 函数的调用,它用于设置包的元数据和安装选项。
name="cn_clip",
# 包的名称。
py_modules=["cn_clip"],
# Python 模块的列表,这些模块将被安装。
version="1.5.1",
# 包的版本号。
author="OFA-Sys",
# 包的作者。
author_email="",
# 包作者的邮箱地址。
long_description=long_description,
# 包的详细描述,这通常来自 README 文件。
long_description_content_type="text/markdown",
# 描述的格式,这里是 Markdown 格式。
packages=packages,
# 要安装的包的列表,这是由 find_packages 函数生成的。
keywords='clip',
# 一组关键字,这些关键字描述了包的主要功能。
install_requires=[
str(r)
for r in pkg_resources.parse_requirements(
open(os.path.join(os.path.dirname(__file__), "requirements.txt"))
)
],
# 包的依赖列表,这是从 requirements.txt 文件中读取的。
data_files=[('clip/model_configs', ['cn_clip/clip/model_configs/RoBERTa-wwm-ext-base-chinese.json',
'cn_clip/clip/model_configs/RoBERTa-wwm-ext-large-chinese.json',
'cn_clip/clip/model_configs/ViT-B-16.json',
'cn_clip/clip/model_configs/ViT-B-32.json',
'cn_clip/clip/model_configs/ViT-L-14.json',
'cn_clip/clip/model_configs/ViT-L-14-336.json',
'cn_clip/clip/model_configs/ViT-H-14.json',
'cn_clip/clip/model_configs/RN50.json',
'cn_clip/clip/model_configs/RBT3-chinese.json'
]),
('clip/', ['cn_clip/clip/vocab.txt'])
],
# 数据文件的列表,这些文件将被安装到 Python 的 site-packages 目录中。
include_package_data=True,
# 如果为 True,那么 setuptools 将会尝试包含所有在 MANIFEST.in 文件中列出,或者在源码控制中找到的数据文件。
url='https://github.com/OFA-Sys/Chinese-CLIP',
# 包的主页 URL。
description='the Chinese version of CLIP.'
# 包的简短描述。
)
- pip安装完之后,如何读取这些clip/model_configs文件呢: 可以使用 pkg_resources 模块来读取包内的数据文件。以下是一个例子:
pkg_resources.resource_filename()
函数接受两个参数:包名和资源的相对路径。这个函数会返回资源在文件系统中的实际路径。你可以使用这个路径来读取文件内容。
import pkg_resources
# 获取文件的路径
file_path = pkg_resources.resource_filename('cn_clip', 'clip/model_configs/RoBERTa-wwm-ext-base-chinese.json')
# 读取文件内容
with open(file_path, 'r') as f:
file_content = f.read()
print(file_content)
3.2. CLIP-ONNX例子
- Github链接:CLIP-ONNX
- 代码结构
.
├── benchmark.md
├── clip_onnx
│ ├── benchmark.py
│ ├── clip_converter.py
│ ├── clip_onnx.py
│ ├── __init__.py
│ └── utils.py
├── requirements.txt
└── setup.py
# ---------------------- 其中__init__.py文件内容如下:
from .clip_converter import clip_converter
from .clip_onnx import clip_onnx
from .utils import Textual, attention
from .benchmark import speed_test
- setup.py文件
import os
import pkg_resources
from setuptools import setup, find_packages
with open("requirements.txt", "r") as f:
install_requires = f.read().split("\n")
setup(
name="clip_onnx",
version="1.2",
py_modules=["clip_onnx, clip"],
description="",
author="Maxim Gerasimov",
packages=find_packages(),
install_requires=install_requires,
include_package_data=True
)
3.3. 问题1和问题2
- 问题1:有的__init__.py文件为空,有什么区别,main.py中导入包的时候有什么区别?
- 问题2:环境变量有什么用PYTHONPATH?
export PYTHONPATH=${PYTHONPATH}:`pwd`/cn_clip
四. 查看安装torch、cuda和cudnn版本号
import torch
print(torch.version)
print(torch.version.cuda)
print(torch.backends.cudnn.version())
- 【TensorRT】TensorRT was linked against cudnn 8.6.0 but loaded cudnn 8.3.2
参考文章
- 如何将python代码打包成pip包(可以pip install)
- 【Python】
__init__.py
文件详解
- 将python代码打包成pip包(可以pip install)