建立和使用Python自定义模块

news2024/10/5 16:30:26

文章目录

  • (一)现状以及问题
  • (二)Python模块
    • (2.1)包的结构
    • (2.2)包的位置
      • (2.2.1)site-packages目录
      • (2.2.2)dist-packages目录
    • (2.3)自定义包
      • (2.3.1)结构和位置
      • (2.3.2)引用自定义包
    • (2.4)用pip查询
      • (2.4.1)自定义包的信息
  • (三)注意
    • (3.1)不靠谱的包
    • (3.2)常规注意事项

我是完全不懂Python的。但是有时也无奈需要写大段大段的Python代码。
之前在《项目所需的Python版本+国内源+虚拟环境+用Conda创建环境》中提到的都是独立的Python项目,当我们把Python类型程序引入生产系统的流程引擎时,又遇到一点小小的问题。

(一)现状以及问题

流程引擎中的每个节点,都是由不同语言开发的单个可执行文件,或单个Java的可执行Jar包,或单个Python文件。这些程序通过数据库进行统一的版本管理和验证。
同时平台是兼容不同操作系统的,所以不管哪种语言,Windows和Linux平台会有很多公共部分代码。

对于可执行程序的公共代码,C/C++,Pascal是比较容易管理的。
之前我也提到过🔗Go项目使用自定义公共单元,以及🔗Java管理自定义公共代码。

但是Python这边,依然是所有东西都写入到一个文件中,重复代码很多,且不利于维护。

呃……是时候分模块了

(二)Python模块

在Python中,package(包)是一个用于组织 Python 模块的方式。
一个 package 就是一个包含了多个 Python 模块的文件夹
这个文件夹中还可能包含其他子文件夹,它们也可以是 package

(2.1)包的结构

在一个 package 中会有一个 __init__.py 文件。
它的作用是将这个文件夹下的所有模块组织在一起,方便我们在其他模块中导入。
如果没有 __init__.py 文件,这个文件夹就只是一个普通的文件夹,无法被当做 package 来使用。

一个有效的 package 结构如下:

mypackage/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        module3.py
        module4.py

我们可以在其他模块中导入这个 package

import mypackage.module1
import mypackage.subpackage.module3

在这个例子中,我们导入了 mypackage 中的 module1 模块和 subpackage 中的 module3 模块。
注意导入 subpackage 时需要指定子包的名字。

package 概念的引入使得代码组织更加清晰,避免了模块之间的命名冲突。使用 package 还能使得我们的代码更加易读、易维护和易重用。

(2.2)包的位置

(2.2.1)site-packages目录

我们用PIP安装的包会放在site-packages目录中,位置如下:

Windows在:{PythonPath}\Lib\site-packages
Linux(Ubuntu)在:/home/{UserName}/.local/lib/{PythonPath}/site-packages

我们自定义的模块就可以放这里。

(2.2.2)dist-packages目录

仅存在于Debian或Ubuntu,差不多意思就是系统分发的包。
我们自定义的模块放这里也行(不过不见得有权限)。

位置比如:/usr/lib/python3/dist-packages
硬说Windows对应的位置……可能这个lib目录:{PythonPath}\Lib算是吧?

(2.3)自定义包

(2.3.1)结构和位置

根据上面的信息,我自定义了一个包ACTP,并放入了site-packages目录。
除了 __init__.py 文件,其它每个文件都包含一个与文件同名的类。
在这里插入图片描述

(2.3.2)引用自定义包

放好后,我们就可以引用它了。

import ACTP.crossPlat
import ACTP.tnu
import ACTP.mylogger
import ACTP.DTStringFinder

但是我的每个模块(文件)中都有和文件同名的类,如果像上面那样引用。
调用时就需要写成crossPlat.crossPlat.someFunction(),有点长。
所以我就像下面这样,导入类。

from ACTP.crossPlat import crossPlat
from ACTP.tnu import tnu
from ACTP.mylogger import mylogger
from ACTP.DTStringFinder import DTStringFinder

(2.4)用pip查询

前面做的部分其实已经够用了。
但是你用pip list,会发现看不到自定义的包ACTP

> pip list
Package            Version
------------------ --------
certifi            2023.5.7
charset-normalizer 3.1.0
distlib            0.3.6
filelock           3.12.0
idna               3.4
piexif             1.1.3
Pillow             9.5.0
pip                23.1.2
platformdirs       3.5.1
py4j               0.10.9.2
pyspark            3.2.0
requests           2.30.0
setuptools         65.5.0
urllib3            2.0.2
virtualenv         20.23.0

再换个指令看看。
包就像根本不存在一下。

> pip show ACTP
WARNING: Package(s) not found: ACTP

(2.4.1)自定义包的信息

如果想用pip listpip show查看包,还得补充一些信息。
我们需要一个{包名}-版本号.dist-info的文件夹,和包一起放在site-packages目录中。
这部分可以参考已有的包。
在这里插入图片描述

目录中有好些文件,我们先不管其它文件。
找到有个METADATA(元数据)的文件。
在这里插入图片描述

我们修改其内容,填入自定义包的信息。
在这里插入图片描述

保存后再试试list和show,包的信息就出来了:

> pip list
Package            Version
------------------ --------
ACTP               1.0.3
certifi            2023.5.7
charset-normalizer 3.1.0
distlib            0.3.6
filelock           3.12.0
idna               3.4
piexif             1.1.3
Pillow             9.5.0
pip                23.1.2
platformdirs       3.5.1
py4j               0.10.9.2
pyspark            3.2.0
requests           2.30.0
setuptools         65.5.0
urllib3            2.0.2
virtualenv         20.23.0
>
> pip show ACTP
Name: ACTP
Version: 1.0.3
Summary: 在奥诚科技的任务调度平台中更加方便的开发Python类型业务规则
Home-page: http://www.scaocheng.com/
Author: 曾如石
Author-email: ddrfan@163.com
License: Private
Location: c:\users\shion\appdata\local\programs\python\python310\lib\site-packages
Requires:
Required-by:

(三)注意

(3.1)不靠谱的包

Python的包package仅仅是目录名称,这种方式不太靠谱。
pip即使检查依赖也不会检查出包里面的问题(缺失,错误)。
所以有时pip反复卸载/安装了包,还是有问题时,可以考虑删除相关包和其依赖的的所有目录,再全部重新安装。

自定义包也一样,需要人工保证代码版本正确,文件没有缺失和错误。

(3.2)常规注意事项

  1. package 要遵循一定的命名规则,通常采用小写字母、下划线分隔符的命名方式,避免使用 Python 关键字或内置函数的命名。

  2. 在导入一个 package 的时候需要注意路径。使用 import 语句时,可以使用绝对导入或相对导入方式,具体使用哪种方式需要根据实际情况来决定。

  3. 避免循环导入。循环导入指的是多个 package 或模块之间相互引用,形成了循环引用的关系。这种情况会导致 Python 解释器发生死循环,并最终崩溃。我们应该避免循环导入,或者对导入顺序进行调整。

  4. 在一个 package 内部,通常会有 __init__.py 文件,其中定义了模块的导出和初始化逻辑。该文件中会包含一些应该暴露给外部的函数、类或者变量,以及 package 的初始化代码。

  5. 在该 package 中,还可能包含一些其他的子模块或子 package,在 __init__.py 文件中,我们可以通过 import 语句将这些子模块或子 package 导出。这样,在导入该 package 的时候,这些子模块或子 package 也会被导入。

总之,使用 Python package 可以使得代码组织更加清晰。
唯独小心按照代码量计算工作量的时候,模块化的思路会导致扣钱(蛤)???

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

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

相关文章

更新阅读量时的常见错误:脏读

最近在对开发完的项目进行测试,于是用到了Jmeter来进行压力测试…… 这里准备压测的是一个获取详情的方法,在获取详情的通知更新阅读量! 上图中代码的逻辑是: 1. 根据ID获取实体 2. 判断实体是否存在 3. 使用三目运算获…

【c++11】c++1特性

c11 c11简介列表初始化std::initializer_list autodecltypenullptr 结语 c11简介 从C0x到C11,C标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C98/03,C11则带来了数量可观的变化,其中包含了约140个新特性,以…

datax-web

【DataX-Web的搭建(Windows/Linux环境)_datax源码部署_zxj19880502的博客-CSDN博客 mirrors / WeiYe-Jing / datax-web GitCode https://github.com/WeiYe-Jing/datax-web/blob/master/userGuid.md 安装使用 这里只记录关键点 1、先安装datax、参考…

LED太阳能感应庭院灯开发方案

在庭院装修的时候,常会使用一些外部美观的照明灯,提供户外照明。为此,宇凡微推出了LED太阳能感应庭院灯方案,庭院灯控制芯片采用宇凡微YF单片机。 一、LED太阳能感应庭院灯方案的原理 太阳能感应庭院灯根据不同的设计需求&#xf…

dp算法篇Day4

"我把每一天都当做新开始&#xff0c;新革命。" 16、买卖股票的最佳时机含手续费 (1) 题目分析 完成一笔交易才算达成交易。但其实你可以将手续费加在任意一处上。 (2) 算法原理 class Solution { public:int maxProfit(vector<int>& prices, int fee)…

从敏捷到精益-漫谈敏捷实践

敏捷宣言与12条原则 让我们一起来回顾一下敏捷宣言和12条原则&#xff0c;不了解这些&#xff0c;怎么进行实践呢。 敏捷宣言&#xff1a; 个体与交互 胜过 过程与工具 可以工作的软件 胜过 面面俱到的文档 客户协作 胜过 合同谈判 响应变化 胜过 遵循计划 敏捷12条原则 1、…

Python学习49:词频统计

类型&#xff1a;文件‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪‬…

WPS表格:使用技巧

文章目录 1、时间1&#xff09;调整时间格式① 连接符② 将“常规、短日期、长日期”格式下的时间调整为自定格式③出现“数字”的情况④ 日期格式方便筛选、统计&#xff1b;转换格式&#xff1b;计算⑤出现#的几种情况⑥ 用“数据---分列”统一变成日期格式 2&#xff09;计算…

SpringBatch从入门到实战(三):作业参数

一&#xff1a;JobParameters传参 api获取 Spring Batch认为一个Job的唯一依据是 job_name hash(JobParameters) 作为联合主键盘 &#xff0c;所以每次执行都会传入一个唯一变动的参数&#xff0c;spring batch 就会认为这是不同的job&#xff0c;就可以重复执行同一个job。 …

Excel中数据转换成甘特图(wps)

数据准备 Excel数据如下表所示&#xff1b; 耗时这一列需要有&#xff0c;没有的话先添加耗时列&#xff1a;单元格E3-C31 自动计算耗时&#xff1b; 转换甘特图 1、调整数据 开始时间列&#xff0c;单元格格式 设置为 常规 2、插入堆积条形图 选中 关键人物 开始时间 和…

Axure必备入门知识

导语 Axure作为专业的原型工具&#xff0c;深受众多产品经理的喜爱&#xff0c;同样也是产品经理应聘的必备技能工具。本期小编将从软件安装及汉化、软件授权、软件使用、案例学习、使用问答、元件库、原型模板及实战原型、原型托管演示等方面介绍Axure必备入门知识&#xff0c…

基于vue搭建的网站如何防范XSS攻击

1.对于从接口请求的数据&#xff0c;尽量使用{{}}加载,而不是v-html ue中的大括号会把数据解释为普通文本。通常如果要解释成html代码则要用v-html。而此指令相当于innerHTML。虽然像innerHTML一样不会直接输出script标签&#xff0c;但也可以输出img&#xff0c;iframe等标签…

国产自主GPU架构“天狼星”在北京亮相

GPU&#xff08;Graphic Processing Unit&#xff09;即图形处理器&#xff0c;是数字世界图形内容生成的基石&#xff0c;不管是桌面应用、游戏、电影、数字孪生还是元宇宙&#xff1b;与此同时&#xff0c;强大的并行计算能力业已成为各种应用加速的主流手段&#xff0c;正广…

混淆矩阵和语义分割评价指标

语义分割评价指标 混淆矩阵和评价指标 https://cocodataset.org/#stuff-eval 混淆矩阵&#xff08;Confusion Matrix) 指标公式准确率、正确率 T P T N ТР T N F P F N \frac{TP TN}{ ТР TNFPFN} ТРTNFPFNTPTN​精确率、精度 P T P ТР F P P \frac{TP }{ ТР F…

VLAN基础知识1_整体介绍

目录 1.VLAN概述 2.VLAN帧格式 3.VLAN端口类型 4.缺省VLAN 5.VLAN打标签和去标签 6.VLAN划分的方法 1.VLAN概述 VLAN&#xff08;虚拟局域网&#xff09;是一种逻辑上划分网络设备的技术&#xff0c;用于将单个物理网络划分成多个虚拟网络。VLAN可以将网络中的设备分组&…

uni-app开发壁纸图像小程序 瀑布流、懒加载展示

标题&#xff1a;使用uni-app开发壁纸图像小程序&#xff1a;瀑布流与懒加载展示 引言&#xff1a; 在今天的移动应用市场中&#xff0c;壁纸图像小程序备受欢迎。为了提高用户体验&#xff0c;我们可以使用uni-app框架来开发这样的小程序&#xff0c;并实现瀑布流和懒加载展示…

Mybatis常见问题

Mybatis执行流程 理解各组件的联系Sql的执行过程&#xff08;参数映射&#xff0c;sql解析&#xff0c;执行和处理结果&#xff09;首先通过mybatis-config.xml文件去加载连接数据库的相关配置&#xff0c;加载sql的映射文件 通过mybatis的配置文件然后去构建会话工厂SqlSess…

chatgpt赋能python:Python整数筛选方法

Python整数筛选方法 Python是一种极其强大的编程语言&#xff0c;特别适合用于数据科学和数字计算。在数字计算中&#xff0c;经常需要筛选出指定范围内的整数。下面将介绍几种Python中筛选整数的方法。 1. 利用循环筛选 最简单的方法是使用循环&#xff0c;逐个检查每个数字…

关于Sui x KuCoin Labs夏季黑客松的七个关键信息

为促进Sui生态发展更进一步&#xff0c;Sui与KuCoin Labs联合举办夏季黑客松&#xff0c;希望能聚集全球加密英才&#xff0c;利用Sui产业领先的技术堆栈激荡出新的火花&#xff0c;为加密产业和Sui生态引入新的力量。本次黑客松总奖金达28.5万美元&#xff0c;分为多个赛道&am…

【React】React中编写CSS,Redux

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React中编写CSS内联样式普通csscss modulescss in js动态添加class ReduxJS纯函数如何创建redux…