python构建并发布自己的包

一、背景

我们平时使用pip install xxx安装包,使用包,但是如果:我们拉取pypi社区的某GitHub项目源码后,发现其源码某文件中会出现:

py 复制代码
import xxx.module_A
from xxx import module_A
import xxx.module_A as A
from xxx import module_A as A

这种字样

注意 :这里的xxx是某文件所在目录的包名,也就是其所属包的名字

注意:不可以直接导入包,python是一定要落脚于模块的

那么直接运行源码,会出现依赖的问题;如何解决这个问题,是本博客解决的事情

类似于下图的依赖过程:

tool.py依赖my_module.py时,平时都是直接引入模块名,但是在发布后的包中,会出现import my_package.my_module as my_module

和我们认知中不一样,并且直接运行这个脚本会出错:

所以我们需要搞清楚这个包为什么这样引入

二、实验过程

包的文件结构:

注意 :实际的包是my_package,而不是这个项目

与第一部分一样,tool依赖了my_module

使用时的测试代码:

py 复制代码
import my_package.tool as tool

if __name__ == "__main__":
    print("hello world")
    tool.my_tool()

构建包

在项目目录下(而不是实际的包目录下),新建setup.py文件:

py 复制代码
from setuptools import setup, find_packages

VERSION = '0.0.1' 
DESCRIPTION = 'My first Python package'
LONG_DESCRIPTION = 'My first Python package with a slightly longer description'

# 配置
setup(
       # 名称必须匹配文件名 'verysimplemodule'
        name="my_package", 
        version=VERSION,
        author="masteryi",
        author_email="<youremail@email.com>",
        description=DESCRIPTION,
        long_description=LONG_DESCRIPTION,
        packages=find_packages(),
        install_requires=[], # add any additional packages that 
        # 需要和你的包一起安装,例如:'caer'
        
        keywords=['python', 'first package'],
        classifiers= [
            "Development Status :: 3 - Alpha",
            "Intended Audience :: Education",
            "Programming Language :: Python :: 2",
            "Programming Language :: Python :: 3",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
        ]
)

测试包

执行python setup.py install

本地安装自己写的包:

成功安装:

在测试文件测试,成功输出:

shell 复制代码
PS D:\project\test_my_pkg> python .\test.py
hello world
this is my_module
this is sub_pkg's m_1
this is sub_pkg's m_2

三、心得

构建包的话,各个模块需要统一引入包名作为所构建包的名称,子包也是一样的处理,否则会出现找不到包的问题

如果按照自己的构建项目的方式构建包,就会出现包的路径有问题的情况

参考资料

相关推荐
caimouse11 小时前
Reactos 第1章 概述
c语言·开发语言·架构
.千余11 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
财经资讯数据_灵砚智能11 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月10日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
namexingyun11 小时前
拆解Fable 5三重安全护栏:模型路由、蒸馏防护与生物安全分类器的技术原理 - 微元算力(weytoken)
java·人工智能·python·安全·架构·ai编程
小短腿的代码世界11 小时前
行情快照与增量更新引擎:Qt在高频交易数据分发中的核心架构——你的行情推送为什么延迟了500ms?
开发语言·qt·架构
初中就开始混世的大魔王11 小时前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
chenment11 小时前
别再为每个模型单独写一套队列了:用 200 行代码封装多模态统一调用层
人工智能·python·产品
啊森要自信11 小时前
【GUI自动化测试】控件、鼠标键盘操作与多场景自动化
c语言·开发语言·python·adb·ipython
YJlio11 小时前
《Sysinternals实战指南》16.5 Ctrl2Cap 工具详解:把 Caps Lock 变成 Ctrl 的键盘改造与回退方法
linux·运维·服务器·网络·python·学习·计算机外设
某林21211 小时前
从底层硬件死锁到 QoS 通信底层的全链路复盘
python·ros2·qos