Python打包封神指南:从杂乱脚本到可安装包,setup.py+find

发布时间:2026/8/29 5:19:07
Python打包封神指南:从杂乱脚本到可安装包,setup.py+find 一、同样写为啥别人的代码能一键安装一群开发者, 有着这般困扰: 编写了几十乃至上百行脚本, 功能明明可行, 却只能局限于本地文件夹内部。更换项目欲调用, 要么复制粘贴致使混乱不堪, 要么报错欲分享予同事, 只能通过打包压缩包来发送, 对方解压之后尚需调整路径, 反复折腾许久方可使用。众人皆是编写代码, 为何有的人所编写的脚本能够制作成可用于安装的包, 而其他某些人仅仅凭借一句pip便能够直接进行调用? 为何你耗费诸多时间熬夜所编写的所谓“实用脚本”, 却只能自己私下使用, 而无法成为能够拿出来展示的“工具”?其实差距并非在于代码的能力, 而是在于有没有掌握那打包的关键核心技巧, 也就是setup.py和。这两个工具, 它能够使得你的“杂乱的脚本”在瞬间就升级成为可以复用、能够分享的专业包, 从“个人的玩具”摇身一变成为“行业的工具”。关键技术说明本文核心会用到这样一个打包工具, 它属于官方所推荐的那种打包工具, 其具备完全开源免费的特性, 也就是说不需要任何费用便能够去使用这样一种打包工具。当前这个项目在某平台上获得的星数已然超过了58000, 它属于生态里最为核心、最为常用的打包组件, 几乎所有能够被安装的包, 都离不开该打包工具给予的支持。该打包工具专门所拥有的核心功能是借助setup.py这类文件去定义包的元数据, 而且还会通过自动识别包的结构, 最终达成代码的迅速打包处理以及安装。二、核心拆解手把手教你从0到1打包代码要把那本地的脚本弄成能够安装的包, 不用进行复杂的操作, 依照下面这些步骤来弄, 就算新手也能够快速地掌握怎么做事。各项代码全都能够直接去复制然后把它用起来, 整个过程不会碰到不好解决的问题。第一步理清包结构——打包的基础是“有条理”倘若要进行打包, 那么其前提条件是, 得把你的代码结构规整得符合规范。正确的包结构是这样划分的, 它含有“外层目录”, 还包含“内层源码目录”, 这两者各自的分工清晰明确, 并且每一方均是不可或缺的一部分。外层目录, 它相当于包的那种“容器”, 其名字建议要和你的包名保持一致, 在里面存放着所有打包所需要的文件, 这里面包含setup.py、.txt等那些文件。内部层次的源码目录, 用于放置你的核心代码, 诸如函数、类以及模块等, 其名字与包名保持一致, 而那里便是你实际要用于打包的内容。简单来说规范的包结构如下你的包名/├─ 你的包名/ 内层源码目录存放核心代码│ ├─ .py 关键文件标记该目录为包└─ 你的, 用以作为例如core.py、utils.py等这般的脚本文件.py。├─ setup.py 打包核心文件必选└─ .txt 依赖文件可选但推荐第二步编写setup.py——打包的“身份证”setup.py是用以打包的核心要件, 其内部涵盖了安装工具pip所需的全部元数据, 这就好比是给你包揽办理了一张“身份凭证”, 向pip传达你的包的名称是什么、创作者是谁、所属版本及性能实现情况。最基础的setup.py代码如下可直接复制修改# 导入setuptools中的setup函数 from setuptools import setup # 调用setup函数定义包的元数据 setup( author你的名字, # 替换成你的名字 description一句话描述你的包功能比如“一个用于椭圆曲线加密的完整包”, # 替换成你的包描述 name你的包名, # 替换成你的包名必须和内层源码目录名一致 version0.1.0, # 版本号后续更新会用到 )这段代码看上去好像蛮简单的, 然而其中却涵盖了用于打包的关键要素: 作者, 描述, name此乃包名, 版本号, 要是缺少了当中任何一个, 那么就极有可能致使打包遭遇失败。第三步版本号怎么定3个规则不踩坑版本号看上去仿若小事一桩, 然而却径直对用户的使用体验以及你包的迭代管理造成影响。规范的版本号格式呈现为: 主版本号.次版本号.修订号举例说来有0.1.0、1.2.3, 其中每个部分含义清晰, 切勿随意胡乱更改。1. 首先是主版本号, 也就是第一个数字, 当你进行了那种不兼容的重大修改的时候, 比如说函数名字被重新命名了, 或者参数出现了被删除的情况, 进而致使旧版本的代码根本就没办法正常运行起来, 就像从1.0.0这种版本升级到2.0.0这个版本一样, 这就预示着存在“破坏性更新”。2. 二级版本编号第二个数字: 于你增添功能, 然而并不对旧代码的运行造成影响之际进行递增, 举例来说增添一个子模块、一个新函数这样的情况。好比从0.1.0升级至0.2.0那般, 用户实施升级之后, 旧代码依旧能够正常予以使用。3. 修订号, 也就是其中的第三个数字, 当出现那种你修复了bug、对内部逻辑进行了优化, 然而却既不新增功能、又不修改原有功能的情况时, 它就会递增。比如说, 从0.1.0升级到0.1.1, 仅仅只是对某个报错做了修复处理, 这种修复不会对用户的使用造成影响。第四步自动找包告别手动罗列倘若你的项目日益复杂起来, 在内层源码目录当中出现了好些子模块以及一些子文件夹之时, 手动于setup.py内逐一罗列全部模块, 不仅繁琐, 而且还易发生遗漏情况——一旦出现新增模块却忘了去更新, 用户安装之后便会报错。在这个时候, 其中的函数开始发挥作用了, 它能够自动地对您的目录展开扫描, 进而寻找到全部需要进行打包的模块, 并不需要您手动去一一罗列。首先修改setup.py导入from setuptools import setup, find_packages setup( name你的包名, author你的名字, description你的包描述, version0.1.0, # 自动查找所有需要打包的模块排除不需要的文件夹 packagesfind_packages(exclude[tests, docs], include[你的包名, 你的包名.*]), )这里有两个关键参数一定要注意挑选出那些不需要进行打包操作的文件夹, 像tests这个被称为测试文件夹的, 还有docs这个被叫做文档文件夹的, 它们涵盖的所有那些内容对于用户去使用包而言并没有起到协助的作用, 要是将其打包进去的话只会使得包的体积有所增加。去指定那个要进行打包操作的核心目录, 得保证仅仅扫描你所拥有的源码目录, 以此来防止错误地打包其他那些没有关联的文件。能够正常开展工作的关键之处在于, 内层源码目录当中一定要有.py文件, 该文件乃是识别“包”的一个标志, 即便里面是空白的内容, 也绝对必须存在。第五步本地安装实时调试完成setup.py的编写之后, 便能够在本地进行你的包的安装操作, 如此一来, 在任何一个项目之中, 都能够直接使用那个你的包, 不必再度忧心路径方面的相关问题。具备简易特性的安装命令, 需开启终端, 而后进入你的外层目录, 此外层目录即setup.py所处的目录, 随后输入以下命令:pip install -e .这里的两个符号含义很关键第一个点, 表示“当前目录”, 它用来告诉pip, 要安装的包就在这当前目录下。, “-e” 表示的含义为 “可编辑模式”, 其为刚接触的新手特别适用有益处的功能, 往后当进行好修改调整包的代码之后, 不用再次去做安装的动作, 所做的修改能自动产生需要的作用有效, 从而把不断重复进行安装的麻烦给去除掉。第六步处理依赖生成.txt好多包都得依靠别的库才能够正常去运行, 就比如说你弄的那个包运用了numpy来开展数学计算以及处理数据, 倘若不向用户讲清楚需要安装这些依赖, 当用户安装了你的包之后, 运行的时候就会出现报错的情况。在这个时候, 那就得于setup.py之中运用参数, 将所有依赖库罗列出来, 以此保证当用户开展安装你的包的操作时, pip能够自动去安装全部缺失的依赖。from setuptools import setup, find_packages setup( name你的包名, author你的名字, description你的包描述, version0.1.0, packagesfind_packages(exclude[tests, docs], include[你的包名, 你的包名.*]), # 列出依赖库规范写法参考下面的例子 install_requires[ pandas1.0, # 推荐指定最低可用版本兼容性更好 matplotlib2.2.1,3, # 推荐指定版本范围兼顾稳定性和兼容性 scipy1.1, # 不推荐固定版本容易和其他库产生冲突 ], # 指定支持的Python版本 python_requires3.6, !3.7.*, )另外, 能够生成.txt文件, 用以记录当下环境的全部依赖版本, 以此便利团队协作以及后续部署。生成命令十分简便, 在终端进行输入:pip freeze requirements.txt生成之后, 将此文件放置到外层的目录当中, 使其与setup.py一同放置就可以了。需要留意的是, 是“最低依赖要求”, 然而.txt属于“当前环境的依赖快照”, 这两者的用途并不一样, 不要使之产生混淆。三、辩证分析打包虽好这些坑千万别踩无可置疑的是, 打包能够使你的代码变得更为专业, 并且更易于复用, 然而, 众多开发者在进行打包操作的时候, 极容易陷入到误区里面, 结果反倒使得打包这件事变得麻烦起来, 甚至还会对用户的使用造成影响。肯定打包所具备的价值: 学会采用打包这种方式, 能够完全解决“脚本仅仅能够在本地予以使用”这一令人困扰的痛点, 促使你的代码从“一次性脚本”成功转变为“能够被反复加以利用的工具”, 不管是面对团队之间的协作情况, 还是针对个人自身的成长而言, 都将使得效率获得提升, 凸显专业化程度。特别是对于那些想要去开展开源项目的开发者来说, 打包乃是发布项目必定需要经历的一条途径, 也是积累行业影响力的关键所在。从辩证的角度去思考, 打包这件事, 并非“越复杂就越佳”, 也并非“所有的代码都得进行打包”。要是仅仅是编写一个简单的脚本, 且只用一回, 还不分享给其他人, 硬是进行打包, 反倒属于多此一举的行为相反地, 要是代码需要反复地被复用, 要分享给别人, 不进行打包的话, 就会使得使用成本大幅地增加呀。进一步而言, 更为关键的是, 存在诸多开发者极易踏入这类打包的陷阱, 其一是版本号无规律地设定, 以至于用户实施升级操作之后代码出现报错的情况其二是依赖版本被固定编写, 从而与用户的环境产生冲突另外还有, 如果不作设置去除无关包体, 那么久会由此致使包体体积过度庞大最后是发生忘记添加.py而造成无法被识别此包的状况。引发思考: 你于打包之际, 有无踩过这般的坑? 有无因了版本号、依赖方面缘由, 致使自身或他人无法顺利投入你的包包之用? 实际上, 只要躲开这些误区点儿, 打包便能够变得简易且高效起来。更深一步来讲: 进行打包的关键要点在于“方便于使用”, 而非“致力于追求形式”。存在一些开发者, 为了展现出专业的样子, 在setup.py之中累加大量毫无关联的参数, 如此一来反倒使得维护成本有所增加又有一些开发者, 疏忽关乎元数据的规范性, 致使包名杂乱无章、描述模棱两可, 就算他人安装了, 也不清楚这个包能够用于何种用途。实际上真正优质的打包, 是具备“简洁、规范、实用”这些特性的, 能让用户一看便知通透、一装上程序就能加以运用的。四、现实意义学会打包到底能帮你解决什么问题对开发者来讲, 打包压根就不是那所谓的“额外任务”, 而是那种能够帮你省下时间、提升竞争力的“必备技能”, 它又能精准处理三个核心需求, 还可以戳到开发者 的痛点、点和爽痛点得以解决: 能完全告别那种尴尬, 即“脚本仅能在本地运用”, 当更换项目、更换电脑时, 凡是安装过那包的, 便能够直接进行调用, 无需再去复制粘贴、调整路径, 从而省去大量重复性工作“分享困难”这一问题也能解决, 不用再去发送压缩包别人只需利用 pip 就能使用自个的代码, 具备高效且专业之特点。满足痒点, 能使你的代码, 从那种毫无条理、杂乱无序的状态, 转变为规范且专业的模样, 不管是你个人独自进行维护, 还是将其交给团队去协同合作, 都能够达到清晰易懂的效果, 进而减少沟通时所产生的成本, 可为后续发布开源项目, 以及打造属于个人的品牌奠定基础, 能让更多的人看到你所具备的代码能力。拥有爽感之处在于当你瞅见自身所编写的代码, 能够被他人经由一键操作而实现安装, 并且可以正常投入使用, 那般成就感是不言而喻的于职场环境里, 能够独立自主去完成打包工作的开发者, 通常而言会更受认可——同样都是在进行代码编写, 别人所编写的代码仅仅局限于自身使用, 而你的代码却能够供整个团队进行复用, 如此一来效率方面的差距便清晰可知了。甚至于, 现今好多企业在招聘开发者之际, 都会提出“掌握打包技巧”这样的要求, 特别是针对处理数据分析、从事后端开发以及参与开源项目的岗位而言 , 打包能力已然成为一项必须具备的技能。而学会打包, 不但能够促使当下工作效率得以提升, 而且还可为自身职业发展增添助力。五、互动话题你平时会给脚本打包吗一个看似简单的打包行为, 其中却暗藏着诸多细节, 新手极易在此处踩坑, 就连老手也有些时候会意外遗漏掉某些规范。在评论区交流交流你的经历: 平常你写脚本的时候, 可会特意去打包? 进行打包之际碰到过最为让人头疼的问题是啥? 是版本号没办法确定恰当, 还是存在依赖之间起冲突的状况, 再或是根本运用不明白?要是掌握了打包技巧, 也欢迎分享你的经验, 比如说怎样规范版本号, 怎样避免依赖冲突, 以此帮助更多新手少走弯路要是还没尝试过打包, 看完这篇文章, 你打算马上动手试试吗?密切留意我, 往后会去更新那经过打包的进阶方面内容, 传授给你怎样去给包增添许可证、进行编写, 还要告诉你是怎样把它发布到PyPI上, 能够让全球范围之内的开发者都能够凭借一键来安装你的代码