15.Python Package目录及打包并发布到PyPI

news2024/10/6 18:21:13

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


文章目录

    • 0.基本介绍
    • 1.`__init__.py`文件
      • 1.1 Regular Package
      • 1.2 namespace package
    • 2.`Python Package`工程
      • 2.1 安装及打包并发布到pypi
      • 2.2 将`Python`文件编译成`.so`
    • 3.包的搜索路径
    • 参考资料

0.基本介绍

Python的强大之处就是它的丰富的开源包,如何开发一个自己的Python Package并将其发布到Pypi呢?在这里记录一下完整的过程。

1.__init__.py文件

python 中的包分成两种,一种是普通包regular package,一种是命名空间包namespace package

1.1 Regular Package

普通包是指包含一个 __init__.py文件的普通目录,在Python 3.2及之前的版本中一直使用的都是这种包。普通包在导入的时候,会隐式自动调用包中的__init__.py文件,__init__.py中定义的对象,变量都会被限制在包名的命名空间中。

如下形式的包:

parent/
    __init__.py
    one/
        __init__.py
    two/
        __init__.py
    three/
        __init__.py

导入parent.one包时,会自动执行parent/__init__.pyparent/one/__init__.py,导入其他的包时情况也类似。

总结,只需要记住,__init__.py是包导入时最先执行的文件

_init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入,也就是支持使用from package import *

__all__ = ['os', 'sys', 're', 'urllib']

1.2 namespace package

命名空间包是指一种特殊的 Python 包,在Python 3.3之后引入,它不包含__init__.py文件,而是由一个或多个不同的目录组成,每个目录都可以包含一个或多个模块。

如有一个命名空间包namespace packagensp,在目录/xx/test_cpp/mypkg/ns/xx/test_cpp/mypkg/pkg下各有一个nsp是文件夹,其中分别包含nsp1.pynsp2.py文件,将路径/xx/test_cpp/mypkg/pkg/xx/test_cpp/mypkg/ns加入到sys.path中,就可以通过import nsp导入文件夹了。

# /xx/test_cpp/mypkg/nsa/nsp/nsp1.py
def print_nsp1():
     print(f"nsp1")

# /xx/test_cpp/mypkg/nsa/nsp/nsp2.py
def print_nsp2():
     print(f"nsp2")

sys.path.insert(-1, "/xx/test_cpp/mypkg/nsa")
sys.path.insert(-1, "/xx/test_cpp/mypkg/nsb")

import nsp # 这里会将两个路径下的nsp合成一个
nsp.print_nsp1()
nsp.print_nsp2()

注意两个文件夹nsp中都不能包含nsp.py,否则无法导入另外一个。

使用 namespace package命名包时,Python包的搜寻规则为,先搜寻常规的package,再搜寻module文件,然后若搜索到不包含__init__.py文件的目录即namespace package会先记录其路径,待sys.path路径搜寻完毕,若regular packagemodule中都没有而namespace package中有,就导入namespace pakge

2.Python Package工程

一个Python Package工程目录示例:

packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│   └── packaging_tutorial/
│       ├── __init__.py
│       └── example.py
└── tests/
  • tests文件夹中放的是包的单元测试文件
  • pyproject.toml文件告诉前端打包工具如pip/build等应该使用哪个后端工具如setuptools/ Hatchling等创建工程的发布包。
[build-system]
# requires是构建包需要的依赖,不需要手动的安装,前端工具如`pip`等会自动安装
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"

除了指定编译系统之外,还需要为包添加元数据metadata,依赖dependencies和内容contents等,这些内容可以保存在pyproject.toml中,也可单独写到setup.py或者setup.cfg文件中。

如‵setup.py`


from setuptools import setup

setup(
    name='mypackage',
    version='0.0.1',
    install_requires=[
        'requests',
        'importlib-metadata; python_version == "3.8"',
    ],
)

或者setup.cfg:

[metadata]
name = mypackage
version = 0.0.1

[options]
install_requires =
    requests
    importlib-metadata; python_version < "3.8"s

setup方法中接受的参数以及含义介绍可以参考这里

setup.py/setup.cfgpyproject.toml文件有重复配置的内容时,优先使用pyproject.toml中的内容。

2.1 安装及打包并发布到pypi

  • 开发模式安装本地包
pip install --editable .
  • 打包包文件,执行完成后,在包路径下生成dist文件夹,其中有打包好的文件
python -m build

# dist
# ├── mypkgg-0.0.1-py3-none-any.whl
# └── mypkgg-0.0.1.tar.gz
  • 将包上传到pypi
# 1.先安装twine包

pip install twine

python3 -m twine upload --repository testpypi dist/*

输入pypi的账号,密码后就可以将包上传到pypi数据库中了,网站上访问显示如下:

在这里插入图片描述

  • 如果git仓库是package,还可以通过如下形式安装:
pip install -q git+https://github.com/lx-r/mypkg.git

python中,为了避免setup.py的误执行,现在更推荐使用setup.cfg

上面包中的文件都是手动创建的,其实每个Python包都需要包含上述文件,如此就可以使用模板来创建Python包,常用的工具有cookiecutter等。

2.2 将Python文件编译成.so

需要使用cython

pip install cython

setup.py文件中设置

from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello1.py", "hello2.py"]))

执行编译命令:

python setup.py build_ext

值得注意的是这里打包的.so文件只能适用于同样平台的同样python版本。

3.包的搜索路径

先搜寻built-in模块module,内建模块在变量sys.builtin_module_names中。

然后到sys.path路径中搜寻,sys.path中包含以下部分,

  • 当前路径
  • 环境变量PYTHONPATH
  • 缺省的安装路径如site-packages

关于包内的导入方式,当包中包含子包的时候,可以使用绝对路径导入,也可以通过相对路径的方式导入:

# mypkg
├── __init__.py
├── mypkg.py
└── utils
    ├── __init__.py
    └── utils.py

导入方式:

from .utils import utils
# in utils.py
from ..mypkg import xx

值得注意的是,相对路径的引入方式都是基于当前模块的名称__name__的,而在主模块中其__name__==__main__,因此在主模块函数中必须使用绝对导入方式。

参考资料

  • 1.https://docs.python.org/3/reference/import.html#packages
  • 2.https://www.cnblogs.com/chaoguo1234/p/9350396.html
  • 3.https://docs.python.org/3/tutorial/modules.html#the-module-search-path
  • 4.https://setuptools.pypa.io/en/latest/userguide/quickstart.html
  • 5.https://zhuanlan.zhihu.com/p/265462717

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

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

相关文章

go test coverage 单测覆盖率

单元测试的最终统计标准就是单测覆盖率&#xff0c;统计单测总体覆盖了多少行代码。一般来说&#xff0c;我们只需要关注增量代码的覆盖率&#xff0c;而非全量代码。增量代码就是本次迭代改动的代码&#xff0c;比如本次迭代改动了100行代码&#xff0c;我们保证单测能覆盖到这…

【Vue工程】007-Scss

【Vue工程】007-Scss 文章目录 【Vue工程】007-Scss一、概述1、CSS 问题三大缺点CSS 预处理器 2、简介3、中文网4、Slogan 二、基本使用1、安装2、配置全局 scss 样式文件3、在 vite.config.ts 配置4、组件中使用5、访问 http://localhost:5173/home 一、概述 1、CSS 问题 参考…

【OJ比赛日历】快周末了,不来一场比赛吗? #05.13-05.19 #14场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-05-…

AC AP简单组网

AC AP简单组网 1、LSW1交换机配置2、AC1控制器配置3、初步效果查看3.1、查看PC1获取地址情况3.2、查看AP获取地址情况 4、AC1控制器配置组网5、组网成功验收5.1、查看AP的物理地址&#xff08;dis arp)5.2、ensp模拟的拓扑结果5.3、STA链接到AP网络5.3、查看STA地址及连通性 vl…

ChatGPT:讯飞星火认知大模型-科大讯飞

讯飞星火认知大模型 科大讯飞推出的新一代认知智能大模型&#xff0c;拥有跨领域的知识和语言理解能力&#xff0c;能够基于自然对话方式理解与执行任务。从海量数据和大规模知识中持续进化&#xff0c;实现从提出、规划到解决问题的全流程闭环。 进入科大讯飞官网点击注册 …

【枚举+数学】CF1781D Many Perfect Squares

Many Perfect Squares - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意&#xff1a; 思路&#xff1a; n&#xff0c;1~50&#xff1a;对n暴力 x&#xff0c;0~1e18&#xff1a;O(1)计算 完全平方数&#xff1a;p^2 Code&#xff1a; #include <bits/stdc.h>#de…

liunx将普通用户提升为管理员

场景 用户要求将账号设置为管理员 操作如下 先登录服务器用管理员账号 打开配置文件/etc/sudoers 此时你会发现文件是空的&#xff0c;为什么呢&#xff1f;原因如下 因为当时使用的是管理员账号 需要切换成root才可以修改此文件 命令sudo su - 操作见图片 操作完之后 用户…

深入浅出解析 JVM 中的 Safepoint

1. 初识 Safepoint-GC 中的 Safepoint 最早接触 JVM 中的安全点概念是在读《深入理解 Java 虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样&#xff0c;都是通过这样的方式第一次对安全点有了初步认识。不妨&#xff0c;先复习一下《深入理解 Java 虚拟机》书中安…

初识Linux篇:第二篇

初识Linux&#xff1a;第二篇 初识Linux&#xff1a;第二篇1.操作系统2.命令行3.Linux的基本指令3.1.ls指令3.2pwd指令3.3cd指令3.4touch指令3.5mkdir指令3.6.rmdir指令 && rm 指令 4.yum中有趣的程序4.1小火车4.2牛4.3Linux_logo(企鹅)4.4在Linux上打开网页 总结 初识…

【Spring全家桶与Mybatis】Spring环境下整合Mybatis(纯注解方式)

⭐️前面的话⭐️ 本文已经收录到《Spring框架全家桶系列》专栏&#xff0c;本文将介绍在Spring环境下整合mybatis。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文…

520快给你喜欢的女生发个表白软件吧!【手把手教学】

文章目录 项目介绍一、创建项目二、设计窗体三、添加事件总结 项目介绍 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 开发工具&#xff1a;Visual Studio 2022 本项目是用C# Winform开发的一个小软件。 实现非常简单&#xff0c;下面看一下这个软件运行…

Vector - CAPL - CANoe硬件CANCANFD参数

如何更改与 CAPL 的 CAN 总线通信的波特率&#xff1f; 解决办法 通常我们常见的配置方法主要有两种方法可以使用 CAPL 更改波特率&#xff0c;使用函数 setBtr或使用 canSetConfiguration、canFdSetConfiguration。 1. setBtr(long channel, byte btr0, byte btr1) setBtr仅…

flink watermark介绍及watermark的窗口触发机制

Flink的三种时间 在谈watermark之前&#xff0c;首先需要了解flink的三种时间概念。在flink中&#xff0c;有三种时间戳概念&#xff1a;Event Time 、Processing Time 和 Ingestion Time。其中watermark只对Event Time类型的时间戳有用。这三种时间概念分别表示&#xff1a; …

[golang gin框架] 30.Gin 商城项目- 购物车商品确认页面以及收货地址的增删改查

一.界面展示 购物车页面 增加功能&#xff1a; 展示用户加入的购物车数据&#xff0c;并点击‘去结算’按钮&#xff0c; 判断是否选中商品 确认订单页面 展示 选中的购物车商品数据(商品标题&#xff0c;图片&#xff0c;数量等)以及 结算的数据(总的价格&#xff0c;总的数量…

【Spring】初识MyBatis (二)

&#xff08;接上一篇【Spring】[初识MyBatis&#xff08;一&#xff09;]&#xff09; 目录 1.2 根据用户名模糊查询用户信息2 添加客户3 更新用户4 删除用户 1.2 根据用户名模糊查询用户信息 【示例6-2】模糊查询的实现只需要在映射文件中通过元素编写相应的SQL语句&#x…

华为手机如何进入开发者模式?连接studio真机调试

对于安卓开发者来说&#xff0c;真机调试是非常好的选择&#xff0c;对电脑配置也没有过分的要求。如果采用Android Studio自带安卓虚拟机调试&#xff0c;真的很慢&#xff0c;一点都不友好。 真机调试的步骤&#xff1a;打开设置->关于手机->版本号&#xff0c;然后连…

并发编程12:AQS

文章目录 12.1 前置知识12.2 AQS入门级别理论知识12.2.1 是什么&#xff1f;12.2.2 AQS为什么是JUC内容中最重要的基石12.2.3 能干嘛&#xff1f;12.2.4 小总结 12.3 AQS源码分析前置知识储备12.3.1 AQS内部体系架构图12.3.2 AQS内部体系架构----AQS自身12.3.1 AQS内部体系架构…

一、H3C-NE实验-抓包实验

实验一&#xff1a;抓包实验&#xff08;PING包&#xff09; 实验拓扑结构图 1. 修改设备名称 步骤1&#xff1a;启动设备 步骤2&#xff1a;在路由器1&#xff0c;进入系统视图&#xff0c;并修改设备名称为R1 步骤3&#xff1a;在路由器2&#xff0c;进入系统视图&#xf…

【Java|基础篇】类和对象

文章目录 1. 前言2. 什么是面向对象3. 类的定义4. 类的实例化5. 对象的构造及初始化6. this引用7. 总结 1. 前言 本篇文章主要讲解了下面三个问题 类的定义和实例化构造方法this关键字 2. 什么是面向对象 众所周知面向过程和面向对象是两种重要的编程思想,而Java是属于面向…

C语言函数大全-- v 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- v 开头的函数 1. va_start 1.1 函数说明 函数声明函数功能void va_start(va_list ap, last_arg);用于初始化一个 va_list 类型的变量&#xff0c;使其指向可变参数列表中的第一个参数 参数&#xff1a; ap&#xff1a; 一个指向 va_…