当前位置: 首页 > news >正文

python自己造轮子使用

项目结构

首先,需要按照下列格式组织你的 package

project                                    (项目名称,随意,与package无关)|----package                           (这个才是包名)|----__init__.py                   (__init__包内每个文件夹下都要有)|----code.py                       (具体的代码)|----other                             (package外可以放一些doc, img之类的,不会被封装到package中)|----__init__.py                       (空着即可)|----setup.py                          (构建脚本)

init.py 如何写?
对于包内的 init.py文件的写法,以下面的包内文件结构为例

|----rofunc                                 (包名)|----devices                            (一级文件夹)|----xsens                          (二级文件夹)|----record.py                  (包含record函数)|----process.py                 (包含data_clean函数)|----__init__.py                (三级__init__)|----optitrack|----record.py|----process.py|----__init__.py|----...|----__init__.py                    (二级__init__)|----lfd|----...                    |----__init__.py                        (一级__init__)

那么如果想要实现以下索引,该怎么写这几层的__init__.py呢?

import rofunc as rf
rf.xsens.data_clean(...)

1.需要在一级__init__.py中

from __future__ import absolute_importfrom .devices import xsens, optitrack, ...
  1. 二级__init__.py空着
  2. 三级__init__.py
from __future__ import absolute_importfrom .record import *
from .process import *

具体在你的包中该如何组织多层__init__.py,实际上要看你对于功能调用格式的设计了。

setup.py 如何写?

# -*- coding:utf-8 -*-
from distutils.core import setup
from setuptools import find_packagessetup(name='declare',version='0.1',packages=find_packages(where='src\\'),  # 查找包的路径package_dir={'': 'src'},  # 包的root路径映射到的实际路径include_package_data=False,package_data={'data': []},description='A python lib for xxxxx',long_description='',author='python developer',author_email='xxxxxxx@qq.com',url='http://www.xxxxx.com/',  # homepagelicense='MIT',install_requires=['requests', 'selenium', 'baidu-aip', 'pillow', 'pywin32'],)
# 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文件中。

实例

from setuptools import setup, find_packagessetup(name="rofunc",version="0.0.0.9",description='The Full Process Python Package for Robot Learning from Demonstration',author="Junjia Liu",author_email="jjliu@mae.cuhk.edu.hk",url='https://github.com/Skylark0924/Rofunc',packages=find_packages(),install_requires=['matplotlib', 'pandas', 'tqdm', 'pillow', 'pytransform3d', 'tensorflow', 'numpy==1.21.6','nestle','pbdlib @ https://github.com/Skylark0924/Rofunc/releases/download/v0.0.0.7.1/pbdlib-0.1-py3-none-any.whl'],python_requires=">=3.6,<3.11",keywords=['robotics', 'learning from demonstration'],license='MIT',classifiers=["Programming Language :: Python :: 3","License :: OSI Approved :: MIT License","Operating System :: OS Independent",],
)

这里重点介绍一下 install_requires 的一些冷知识:如果依赖的包没有发布在PYPI,又不想/不能封在自己的包内,那么可以参照我对于 Sylvain Calinon 老师的pbdlib包的处理方法。

pbdlib包是一个托管在 Gitlab 上的示教/模仿学习python库,原地址为 https://gitlab.idiap.ch/rli/pbdlib-python 。可以发现,这个库里是有setup.py的,但是只被用来做 git clone 之后的本地安装。我的解决方案是:

本地打包(参照下一节的内容):git clone …
python setup.py bdist_wheel sdist
你会发现,主目录下会生成build和dist两个文件夹,dist下可以找被我们称作“轮子”的,对该库封装的压缩包pbdlib-0.1-py3-none-any.whl
将其作为Release文件,上传到github的某个版本的Release中(当然,你自己有个人网站也是可以的,能够完整下载就行)
在install_requires中,以包名+url的形式加入依赖’pbdlib @ https://github.com/Skylark0924/Rofunc/releases/download/v0.0.0.7.1/pbdlib-0.1-py3-none-any.whl’
即可实现用户只需pip install rofunc,自动安装pbdlib依赖库。
很遗憾的是,尽管这样的写法允许我们在本地安装的时候直接安装这些未上传到PYPI的依赖,但是由于规则限制,拥有这种直接链接的package无法被推送到pypi。会收到如下报错:

HTTPError: 400 Client Error: '[your requirements]' is an invalid value for Version. Error: Can't use PEP 440 local versions. See https://packaging.python.org/specifications/core-metadata for url: https://test.pypi.org/legacy/:

详情请参见 issue 430,以及这个链接。
·https://link.zhihu.com/?target=https%3A//github.com/pypa/twine/issues/430
·https://link.zhihu.com/?target=https%3A//resultfor.dev/670121-how-can-i-use-git-repos-as-dependencies-for-my-pypi-package

包内数据
Setuptools有关于这部分的教程,但是你会发现需要指定文件类型,而且每个文件夹下都要有一个__init__.py。这么麻烦的方式肯定不适合把整个文件夹的数据打包起来。于是,我就发现可以通过在project目录下再写一个 MANIFEST.in文件来实现。通过直接指定想要添加的数据路径就ok了recursive-include rofunc/data/ *
recursive-include rofunc/simulator/assets/ *
此外,还需要在setup.py文件中加一行来指向MANIFEST.in文件include_package_data=True

Python setup.py和MANIFEST.in文件
https://link.zhihu.com/?target=https%3A//blog.csdn.net/fragmentalice/article/details/44833013

The MANIFEST.in template
https://link.zhihu.com/?target=https%3A//docs.python.org/2/distutils/sourcedist.html%23the-manifest-in-template

打包、安装与推送

打包
python setup.py bdist_wheel            # 打包为whl文件
python setup.py sdist                  # 打包为tar.gz文件python setup.py bdist_wheel sdist      # 也可以一起写,省事

或者直接

python -m build

本地安装


执行完之后会在当前目录生成 dist 文件夹,文件夹内部是编译好的 python 包,whl 后缀结尾cd dist
执行安装命令pip install rofunc-0.0.0.9-py3-none-any.whl
卸载pip uninstall rofunc

相关文章:

python自己造轮子使用

项目结构 首先&#xff0c;需要按照下列格式组织你的 package project &#xff08;项目名称&#xff0c;随意&#xff0c;与package无关&#xff09;|----package &#xff08;这个才是包名&#xff09;|----…...

Elastic stack8.10.4搭建、启用安全认证,启用https,TLS,SSL 安全配置详解

ELK大家应该很了解了&#xff0c;废话不多说开始部署 kafka在其中作为消息队列解耦和让logstash高可用 kafka和zk 的安装可以参考这篇文章 深入理解Kafka3.6.0的核心概念&#xff0c;搭建与使用-CSDN博客 第一步、官网下载安装包 需要 elasticsearch-8.10.4 logstash-8.…...

解决npm报错Error: error:0308010C:digital envelope routines::unsupported

解决npm报错Error: error:0308010C:digital envelope routines::unsupported。 解决办法&#xff1b;终端执行以下命令&#xff08;windows&#xff09;&#xff1a; set NODE_OPTIONS--openssl-legacy-provider然后再执行 npm命令成功&#xff1a;...

高防IP是什么?有什么优势?

一.高防IP的概念 高防IP是指高防机房所提供的IP段&#xff0c;一种付费增值服务&#xff0c;主要是针对网络中的DDoS攻击进行保护。用户可以通过配置高防IP&#xff0c;把域名解析到高防IP上&#xff0c;引流攻击流量&#xff0c;确保源站的稳定可靠。 二.高防IP的原理 高防I…...

php费尔康框架phalcon(费尔康)框架学习笔记

phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里&#xff0c;推荐php版本>5.4) 环境不支持伪静态网址时的配置 第一步&#xff1a; 在app\config\config.ini文件中的[application]节点内修改baseUri参数值为/invo/index.php/或…...

StartUML的基本使用

文章目录 简介和安装创建包创建类视图时序图 简介和安装 最近在学习一个项目的时候用到了StartUML来构造项目的类图和时序图 虽然vs2019有类视图&#xff0c;但是也不是很清晰&#xff0c;并没有生成uml图&#xff0c;但是宇宙最智能的IDE IDEA有生成uml图的功能 下面就简单介…...

飞天使-django概念之urls

urls 容易搞混的概念&#xff0c;域名&#xff0c;主机名&#xff0c;路由 网站模块多主机应用 不同模块解析不同的服务器ip地址 网页模块多路径应用 urlpatterns [ path(‘admin/’, admin.site.urls), path(‘’, app01views.index), path(‘movie/’, app01views.movi…...

MongoDB分片集群搭建

----前言 mongodb分片 一般用得比较少&#xff0c;需要较多的服务器&#xff0c;还有三种的角色 一般把mongodb的副本集应用得好就足够用了&#xff0c;可搭建多套mongodb复本集 mongodb分片技术 mongodb副本集可以解决数据备份、读性能的问题&#xff0c;但由于mongodb副本集是…...

modbus报文

MODBUS规约报文解析-CSDN博客...

flutter报错: library “libflutter.so“ not found

修改android/app/build.gradle defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "cn.rentsoft.flutter.openim.consumer" // You can update the …...

MR混合现实情景实训教学系统模拟历史情景

二、应用场景 1. 古代战争场景&#xff1a;通过MR混合现实情景实训教学系统&#xff0c;学生可以亲身体验古代战争的场景&#xff0c;如战场布置、战术运用等。这不仅有助于学生更好地理解古代战争的特点&#xff0c;还能够培养他们的团队协作和战略思维能力。 2. 历史文化古…...

计算机视觉的应用16-基于pytorch框架搭建的注意力机制,在汽车品牌与型号分类识别的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用16-基于pytorch框架搭建的注意力机制&#xff0c;在汽车品牌与型号分类识别的应用&#xff0c;该项目主要引导大家使用pytorch深度学习框架&#xff0c;并熟悉注意力机制模型的搭建&#xff0c;这个…...

Flutter 实现 Android CollapsingToolbarLayout折叠布局效果

Flutter 是通过Tabbar TabbarView 来实现 类似Android Viewpager 页面切换的效果的。我个人觉得Flutter 的tab 切换实现过程要比Android的实现过程要简单容易不是一星半点&#xff0c;哈哈哈哈 &#xff0c;因为她所用到的widget 都是google 官方封装好的&#xff0c;用起来代…...

数据库管理-第116期 Oracle Exadata 06-ESS-下(202301114)

数据库管理-第116期 Oracle Exadata 06-ESS-下&#xff08;202301114&#xff09; 距离上一次正儿八经的技术分享又过了整整一周了&#xff0c;距离上一期Exadata专题文章也过了11天了&#xff0c;今天一鼓作气把ESS写完&#xff0c;毕竟明天又要飞北京了。 1 Smart Scan 其…...

阿里云C++二面面经

1.智能指针 1、shared_ptr 原理:shared_ptr是基于引用计数的智能指针,用于管理动态分配的对象。无论 std::shared_ptr 存储在堆区还是栈区,它所指向的内存块始终存储在堆区。这是因为 std::shared_ptr 是用于管理动态分配的内存的智能指针,它需要存储在堆区,以便进行引用…...

Ubuntu 20.04编译Chrome浏览器

本文记录chrome浏览器编译过程&#xff0c;帮助大家避坑qaq 官网文档&#xff1a;https://chromium.googlesource.com/chromium/src//main/docs/linux/build_instructions.md 一.系统要求 一台64位的英特尔机器&#xff0c;至少需要8GB的RAM。强烈推荐超过16GB。至少需要100…...

大文件分片上传、断点续传、秒传

小文件上传 后端&#xff1a;SpringBootJDK17 前端&#xff1a;JavaScriptsparkmd5.min.js 一、依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</ve…...

DAY53 1143.最长公共子序列 + 1035.不相交的线 + 53. 最大子序和

1143.最长公共子序列 题目要求&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删…...

短剧App开发:个性化的内容推荐

随着移动互联网的普及和用户需求的多样化&#xff0c;短剧App作为一种新兴的内容消费模式&#xff0c;受到了越来越多用户的青睐。在短剧App开发中&#xff0c;个性化的内容推荐是一个重要的功能&#xff0c;它能够根据用户的兴趣偏好和行为数据&#xff0c;为他们提供更精准、…...

互斥量保护资源

一、概念 在多数情况下&#xff0c;互斥型信号量和二值型信号量非常相似&#xff0c;但是从功能上二值型信号量用于同步&#xff0c; 而互斥型信号量用于资源保护。 互斥型信号量和二值型信号量还有一个最大的区别&#xff0c;互斥型信号量可以有效解决优先级反转现 象。 …...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...