如何实现python构建打包供他人安装
admin
2024-03-12 22:33:25
0

假如在同一级目录下有两个python文件(即python模块),那么这两个模块不需要安装也能相互进行import引用,但是不在同级目录下甚至不在同一项目中的模块怎么做到相互引用呢?

Python setuptools

setuptools是python自带用于打包构建的工具,使用此工具可打包出可供import引用的模块或者可供他人安装的wheel包。
官方文档:setuptools

pip install安装模块

首先需要在项目根目录创建setup.py,用于设置setuptools的构建配置。这里是直接使用的setuptools.setup()函数进行配置,官方推荐的方式是使用setup.cfg配置文件。

import setuptools
setuptools.setup(name='test-tool', # 扩展功能包名称py_modules=['test'] # 打包模块名称,对应test.py,安装包之后使用此名称进行import
)

切换到项目根目录,通过pip install .命令进行安装。安装成功后,就可以在其他python文件中import模块并调用该模块下的函数。

pip wheel打包构建

这里同样是使用setuptools.setup()函数方式进行配置,如下。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import setuptoolssetuptools.setup(name='test-tool',version='1.0.0',description='Description.',author='San',author_email='San@163.com',package_dir={"": "src"}, # 打包目录packages=setuptools.find_packages(where='src') # 搜索存在__init__.py打包文件夹
)

使用pip wheel .打包后会在当前目录生成*.whl文件,将这个文件提供给其他人,其他人通过pip install *.whl就能将此安装包安装到扩展库。
关于打包配置需要说明以下几点:

  1. find_packages()只会搜索目录下包含__init__.py文件的目录进行打包。
  2. find_packages()可以设置打包剔除目录:
setuptools.find_packages(exclude=['additional*']) # 剔除additional目录
  1. 区分.whl包python包的概念:
    打包成功生成的.whl文件是一个安装包,而python包指的是含有__init__.py文件的目录。
  2. 安装包被安装成功后,会在D:\python3.10\Lib\site-packages路径下出现python扩展功能包,注意D:\python3.10为python在本机的安装目录。
  3. 项目的层级目录使用官方推荐的创建方法,如下:
├── src
│   └── mypkg
│       ├── __init__.py
│       └── tool1.py
├── setup.py
└── setup.cfg
如何确定打包构建的代码是否正确
  1. 项目构建后,会出现./build/lib目录,在该目录下的模块才会被打进.whl安装包。
  2. 对于不需要被打包的模块,需要在此目录中删除或者使用setup.py clean清除临时打包目录。
  3. 在此目录下可以对打包的模块和模块下的代码进行检查确定。

构建问题解决

执行pip wheel .报错usage: setup.py [global_opts]

报错usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]

  • 解决办法:
    查看具体报错信息,发现造成错误的原因是没安装wheel工具,实际在执行时用的指令是setup.py install
    最简单的解决办法是pip install wheel安装wheel,其次可以使用传统指令python setup.py bdist_wheel去打包。
打包报错error: package directory ‘mypkg’ does not exist

造成此错误的原因是配置打包目录src时没有同时设置find_packages()。正确示例如下。

package_dir={"": "src"},
packages=setuptools.find_packages(where='src')
error: error in ‘egg_base’ option: ‘src’ does not exist or is not a directory

文件夹src与setup.py不在同级目录下时会出现此错误,需将setup.py移至与src文件夹同级目录。

引用模块报错Cannot find reference ‘test-tool’ in ‘init.py’

此问题也是个大坑,找了很久原因,最后发现是模块名称(也就是python文件)命名中包含"-",不符合Python编写规范导致的。

python文件只能以英文小写命名,单词间可以用下划线

常用构建命令

pip list # 查看已安装扩展包列表
pip uninstall test-tool # 卸载扩展包
pip wheel . # 打包构建
pip install cert_kit-1.0.0-py3-none-any.whl # 安装扩展包
pip install -e . # 调用模块下的最新文件安装

本文以个人经验总结而成,内容有误的地方还请读者指正。

相关内容

热门资讯

中国银行招标结果:中国银行北京... 证券之星消息,根据天眼查APP-财产线索数据整理,中国银行股份有限公司5月24日发布《中国银行北京庄...
原创 A... "上下同欲者胜。"——《孙子兵法》 “厂家那边又逼我压两百万的货,可库存早都冒了。” 凌晨两点...
原创 “... 全款买房”和贷款30年,差别到底有多大?曹德旺一句话点醒了很多人 前阵子,一个朋友把看了半年的房子终...
云英谷科技登陆港交所:AI终端... 5月27日,云英谷科技股份有限公司(股票简称:云英谷科技,股票代码:3310.HK)成功登陆港交所主...
京东集团与三一集团签订战略合作... 5月25日,京东集团与三一集团在北京签署战略合作协议。京东集团SEC副主席、京东集团CEO许冉与三一...
青岛的朋友看过来:黄金回收我跑... 前阵子想把家里一些旧金饰处理掉,在青岛问了几家回收黄金的地方。今天就跟大家随便聊聊我打听、上门、对比...
武汉有闲置贵重金属变现需求该怎... 不少有黄金回收需求的用户不知道该如何挑选合适的服务机构,其实只要从资质、专业度、服务能力、口碑几个维...
业绩再度下滑,石药集团一季度归... 图片来源:视觉中国 蓝鲸新闻5月27日讯(记者 屠俊)5月27日午间,石药集团(01093.HK)公...
蚂蚁CEO韩歆毅:在Agent... 【CNMO科技消息】近日,蚂蚁集团CEO韩歆毅在演讲中,系统分享了关于智能体经济和AI支付的底层思考...
Buff叠满!芯片,双重利好!... 芯片领域,传来两则大消息! 一是5月27日有媒体报道称,台积电3纳米制程下半年将涨价15%,明年或再...
“全球正面临第五次油价冲击” 日本央行行长植田和男27日在东京说,自上世纪70年代以来,全球多次经历能源价格急剧上涨,当前全球正面...
白酒股,直线拉升!600779... 【导读】白酒股终于涨了 中国基金报记者 泰勒 大家好,花有重开日,人无再少年。就在刚刚,低迷许久的“...
河北地区闲置名酒如何合规变现 闲置名酒处置的行业现状 近年来随着居民酒类收藏意识的逐步提升,不少家庭都存有不同品类的年份名酒,当...
重磅!长鑫科技科创板IPO获通... 5月27日消息,长鑫科技科创板IPO获上交所上市委会议通过。
东方基金开展“一司一省一高校”... 为深入贯彻落实新“国九条”以及《推动公募基金高质量发展行动方案》的核心要求,积极响应证监会对于金融机...
那句「都是卖猪食的」,为什么你... 你大概也笑了一下。 最近有句话在网上传疯了,说字节的副总裁回怼腾讯的“短视频像猪食”,撂了一句“都是...
2026 年小红书多账号管理工... 摘要 2026 年小红书矩阵运营成品牌获客主流,但账号风控严、消息分散、转化低效等痛点突出。本文基...
打着高知女性旗号割韭菜,“五个... 出品丨搜狐财经 作者丨柴鑫洋 编辑丨李文贤 你被“五个女博士”种草过吗? 打着高知女性旗号,却做着低...
A股董责险渗透率破32%,海南... 开栏语: 保险是经济的“减震器”,但保险条款复杂晦涩,犹如海下暗礁。 即日起,海财经·证券导报开设“...
奥尼电子:49万股限制性股票将... 5月27日,奥尼电子(301189)发布公告,2025年限制性股票激励计划第一个归属期归属结果已确定...