如何实现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 . # 调用模块下的最新文件安装

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

相关内容

热门资讯

涨价了!000636,包揽AI... 近一周机构调研个股有20多只,风华高科调研机构数最多。 据证券时报·数据宝统计,风华高科(00063...
白癜风医生郑华国:白癜风与铁元... 铁元素是人体必需的微量元素,参与血红蛋白合成、氧气运输和皮肤细胞代谢,对白癜风患者而言,铁元素缺乏会...
2025年度中国营商环境研究报... 今天(2月28日)上午,中国贸促会举行新闻发布会,会上发布《2025年度中国营商环境研究报告》。 ...
求是网评论员:要坚持消费和投资... 加快培育完整内需体系,是畅通国民经济循环、增强国内大循环主体地位的重要基础。提振消费和扩大投资是完整...
百度财报新信号:告别广告舒适区... 来源:华夏时报 本报(chinatimes.net.cn)记者卢晓 北京报道 当传统广告业务遭受严...
原创 3... 今年3月马上就要迎来一轮涉及四大类商品的降价潮! 咱中国最近消息一个接一个,降价风暴不仅卷到房子上...
骏马迎春至 兴福暖万家——兴业... 鲁网2月28日讯春节前夕,兴业银行围绕“惠民生、促消费”主线,以“龙马精神 兴福万里——好运兴福年”...
如何应对全球产业格局之变? 百年变局加速演进,世界经济版图深度调整,全球产业格局正经历一场系统性重构。面对全球产业格局的深刻变革...
原创 金... 2026年2月28日,黄金市场在避险情绪与资产配置需求的推动下维持高位运行,国内基础金价稳居1144...
三度闯关终成功 龙辰科技成功过... 上证报中国证券网讯(记者 张雪)2月27日,龙辰科技上市申请获得北交所上市委审核通过。此次为公司第三...
我国自3月1日起对原产于加拿大... 新华社北京2月28日电(记者谢希瑶)商务部28日公布对原产于加拿大的进口油菜籽反倾销调查的最终裁定,...
原创 硬... 美国这回在关税问题上栽了个大跟头。 不是小打小闹,是硬生生被自己最高法院拦腰斩断了政策根基。 特朗普...
原创 美... 特朗普在2026年2月24日那天,站在国会大厅里,一口气讲了1小时47分钟。 这是美国历史上最长的一...
【招商引资项目】华能上都新能源... 华能上都新能源外送基地联营项目是锡林郭勒盟聚焦清洁能源外送、深化央地合作、服务京津冀能源保障的重点招...
刘军连:白癜风患者如何护理肘部... 肘部是白癜风的高发部位,此处关节活动频繁,易受衣物摩擦、桌面挤压,且长期暴露在外,易受紫外线直射,皮...
谷歌的世纪豪赌:借百年的钱,买... 作者 | 丁卯 2月10日,谷歌母公司Alphabet在全球债券市场投下一枚震撼炸弹。 此次Alph...
仁东控股集团股份有限公司 一、重要提示 本年度报告摘要来自年度报告全文,为全面了解本公司的经营成果、财务状况及未来发展规划,投...
原创 深... 你要说这两年深圳的“港味儿”有多浓?去趟山姆超市或者COCO Park溜达一圈就知道了。别说普通话,...
原创 下... 黄金市场正处在一个前所未有的紧绷时刻。 2026年2月26日,伦敦现货黄金价格在一天之内上演了深V反...
上海安路信息科技股份有限公司2... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...