『Python学习笔记』Python代码打包成pip包(可pip install)|查看安装torch、cuda和cudnn版本号

news2024/9/30 21:23:52
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 社区标准:将代码打包并发布到 PyPIPython 社区的标准做法,这样可以让你的代码更容易被其他 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 文件。
  • 在大多数情况下,如果用户环境中安装了适当的 Pythonpip 版本,推荐使用 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue使用driver.js完成页面引导的功能

需求:用户首次进入的时候肯定不知道一些功能是干什么在哪里,之后给用户一个页面引导,教他怎么做。 点击插件driver.js官方文档 效果: 1.下载driverjs 我默认下载的是最新版 "driver.js": "^1.0.5",&#x…

MySQL 高级SQL语句(一)

目录 一、高级SQL语句(进阶查询) 1.1 select 1.2 distinct 1.3 where 1.4 and 和 or 1.5 in 1.6 between 1.7 通配符 1.8 like 1.9 order by 一、高级SQL语句(进阶查询) 先准备2个表 一个location表: use m…

私人记账本程序cashbook

什么是 cashbook ? cashbook 是一个私人或家庭记账程序,支持私有化部署,商用或其他使用不受约束。建议使用者每年创建一个账本,图表功能可以起到分析全年数据的效果。 官方提供了演示站点,但不建议记录真实数据 演示账…

ardupilot 遥控的输入控制模式

目录 本节主要记录自己整理ardupilot的遥控器的输入控制模式:正常模式、简单模式、超简单模式的理解。 1.正常模式(有头模式) 在不用简单和超简单的模式的情况下,无人机操作员操作的控制输入是对应着不断旋转着的飞行器进行操作的。如上方图所示举例,当无人机操作员进行…

flask中的werkzeug介绍

flask中的werkzeug Werkzeug是一个Python库,用于开发Web应用程序。它是一个WSGI(Web Server Gateway Interface)工具包,提供了一系列实用功能来帮助开发者处理HTTP请求、响应、URLs等等。Werkzeug的设计非常灵活,可以…

基础入门-SpringBoot-自动配置特性

一、自动配好Tomcat 引入Tomcat依赖。配置Tomcat <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.3.4.RELEASE</version><scope>compile</sco…

同城跑腿小程序怎么做

同城跑腿小程序是一款基于地理位置的服务平台&#xff0c;为用户提供了便捷的日常生活服务。以下是该小程序的主要功能介绍&#xff1a; 1. 快速下单&#xff1a;用户可以通过小程序平台快速填写订单信息&#xff0c;包括取送地址、物品类型和重量等信息&#xff0c;然后选择合…

LabVIEW开发环境试验箱控制器

LabVIEW开发环境试验箱控制器 环境或气候试验箱是一种外壳&#xff0c;用于模拟各种材料&#xff08;包括工业产品、生物物质、复合材料、电子设备和航空航天部件&#xff09;的特定环境条件&#xff0c;并评估调节对这些材料的影响。 环境试验箱&#xff08;ETC&#xff09;…

存储过程——游标

1.游标 什么是游标&#xff0c;以及游标使用的相关语法。 #声明游标&#xff0c;存储查询结果集 #准备&#xff1a;创建表结构 #开启游标 #获取游标中的记录 #插入数据到新表中 #关闭游标 create procedure p11(in uage int) begindeclare uname varchar(100);declare upro …

Istio 故障注入与重试的实验

故障注入 Istio流量治理有故障注入的功能&#xff0c;在接收到用户请求程序的流量时&#xff0c;注入故障现象&#xff0c;例如注入HTTP请求错误&#xff0c;当有流量进入Sidecar时&#xff0c;直接返回一个500的错误请求代码。 通过故障注入可以用来测试整个应用程序的故障恢…

DYLD--动态链接器

概念 dyld&#xff08;the dynamic link editor&#xff09;是苹果的动态链接器&#xff0c;是苹果操作系统一个重要组成部分&#xff0c;在系统内核 XNU 完成 Mach-O 文件的加载&#xff0c;做好程序准备工作之后&#xff0c;交由 dyld 负责余下的工作。在 macOS 系统中&…

vue2引入lottie动画

说明下&#xff1a;如果你是vue3的话请移步&#xff1a;https://blog.csdn.net/qq_67801847/article/details/128386661&#xff0c;这里只针对vue2. 同时动画官网链接&#xff1a;lottie官网 实现思路&#xff1a; 1. 安装lottie-web (版本无所谓) 2. 在使用的页面引入组件 #…

一起来看看音频转文字怎么弄吧

从前有一个名叫小明的学生&#xff0c;他在学校里总是很喜欢录制各种有趣的音频&#xff0c;包括老师的讲课、同学们的笑声&#xff0c;以及校园里的各种声音。有一天&#xff0c;他在课堂上录下了老师的授课内容&#xff0c;想着晚上回家后再将它们转换成文字&#xff0c;便于…

网络安全(黑客)学习手册

1.什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一是市场需求量高&#xff1b; 二则是发展…

Python+大数据开发拿到25k的offer!

随着95后、00后的登场&#xff0c;80后好似成为“古早”的存在&#xff0c;看似被生活磨平了棱角的他们&#xff0c;其实也在渴望重新“支棱”起来。今天分享的这位80后的逆袭故事&#xff0c;希望你能感受到他的力量…… 学科 | Python大数据开发 校区 | 北京 薪资 | 25k 我…

【深度学习之YOLO8】视频流推断

官方V8模型下载 需要准备两个东西 simsun.ttc字体包YOLOv8官方模型成品 ScreenCapture屏幕图像类 import cv2 import mss import numpy as npclass ScreenCapture:"""parameters----------screen_resolution : Tuple[int, int]屏幕宽高&#xff0c;分别为x&a…

5.2.11.添加读写接口

5.2.11.添加读写接口 5.2.11.1、在驱动中添加 5.2.11.2、在应用中添加 5.2.11.3、测试 1. app.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>#define FILE "/dev/test" // 刚才mknod创建的设…

K8S中网络如何通信

Kubernetes 提出了一个自己的网络模型“IP-per-pod”&#xff0c;能够很好地适应集群系统的网络需求&#xff0c;它有下面的这 4 点基本假设&#xff1a; 集群里的每个 Pod 都会有唯一的一个 IP 地址。Pod 里的所有容器共享这个 IP 地址。集群里的所有 Pod 都属于同一个网段。…

WT588F02B-8S 血压计语音芯片如何选型?低功耗语音ic方案

一、血压计语音提示方案需求设计&#xff1f; 血压计语音提示方案的需求设计是为了实现在测量血压过程中&#xff0c;通过语音提示用户操作指引、测量结果和健康建议等功能。以下是血压计语音提示方案需求设计的主要需求&#xff1a; &#xff08;1&#xff09;测量操作引导 …

QT---day1(QT的介绍、常用类及组件)

代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口尺寸this->setFixedSize(600,500);//设置窗口标题this->setWindowTitle(&q…