当前位置: 首页 > news >正文

【Python】(自定义函数)模块的相对路径导入

是我以前写的老文章的升级版,本质上使用execsys.path实现相对路径导入。



RelativeImport:

__version__='1.1.0'
__author__='Ls_Jan'import os
import sys
import inspectdef RelativeImport(module,*args):#模块导入'''module为模块所在路径(模块名不需要.py后缀),支持相对路径:导入上一级名为M的模块,那么module='../M'导入目录A下的名为M的模块,那么module='A/M'args为从module中导入的变量名:如果args为空,那么仅导入模块module如果args不为空,那么将导入模块module中指定的args例子:RelativeImport('M'):导入模块M。【等同import M】RelativeImport('M','info','func'):导入模块M中的info和func。【等同于from M import info,func】RelativeImport('M','*'):导入模块M中所有内容。【等同于from M import *】RelativeImport('../M'):导入上级目录中的模块M。RelativeImport('A/M','info'):导入A目录下的模块M中名为info的变量。特别的,支持“重命名”行为:RelativeImport(('M','mmm')):导入模块M并命名为mmm。【等同import M as mmm】RelativeImport('M',('info','i'),('func','f')):导入模块M中的info和func并分别命名为i和f。【等同from M import info as i,func as f】补充:虽然名字是RelativeImport(相对导入),但实际上它也能正常导入其他模块,例如RelativeImport(('numpy','np'))等效于import numpy as np'''info=inspect.stack()[1]#调用者的上下文信息frame=info.framefileName=info.filenamevarG=frame.f_globalsif(type(module)!=tuple):module=(module,None)sourcePath=os.path.dirname(fileName)#调用该函数的文件所在的路径(绝对路径)relativePath,module_exec=os.path.split(module[0])#模块所在目录(相对路径) + 模块名modulePath=os.path.join(sourcePath,relativePath)#模块所在路径(绝对路径)sys.path.append(modulePath)#将路径临时加入到系统列表中if(args):lst=[]for item in args:if(type(item)==tuple):lst.append(f'{item[0]} as {item[1]}')else:lst.append(f'{item}')exec(f'from {module_exec} import {",".join(lst)}',varG)else:if(module[1]):exec(f'import {module_exec} as {module[1]}',varG)else:exec(f'import {module_exec}',varG)sys.path.pop()#移除临时加入的路径


补充:

  • 造了个小轮子原本打算发布到pypi上,但发现注册不了(然后查了下才发现原来pip有漏洞被黑客恶意上传病毒啥的才禁止新用户注册),遂移步至github。
  • 下载轮子,安装轮子,成为轮子 :RelativeImport-1.1-py3-none-any.whl,pip install RelativeImport-1.1-py3-none-any.whl,建议去github查看详细操作(毕竟如果github都上不去那轮子更不可能下载的了。
  • github项目链接:https://github.com/Ls-Jan/Python_RelativeImport/tree/main


参考:

  • 【Python】获取调用者信息: https://blog.csdn.net/weixin_44733774/article/details/134665412
  • python之PypI打包whl文件:https://www.cnblogs.com/yuhaohao/p/13099552.html
  • pip安装本地包:https://blog.csdn.net/enter89/article/details/90291667


本文发布于CSDN,未经个人同意不得私自转载:https://blog.csdn.net/weixin_44733774/article/details/134672481

http://www.lryc.cn/news/246993.html

相关文章:

  • 巧妙之中见真章:深入解析常用的创建型设计模式
  • Selenium切换窗口、框架和弹出框window、ifame、alert
  • QT linux下应用程序打包
  • Java高级技术(单元测试)
  • leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解
  • C++基础 -10- 类
  • 【软件测试】性能测试相关指标
  • Leetcode 2943. Maximize Area of Square Hole in Grid
  • qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
  • springboot中4级配置文件优先级
  • Python(八十九)函数的参数的内存分析
  • 西南科技大学C++程序设计实验二(类与对象一)
  • 代码随想录二刷 |哈希表 |四数之和
  • KMP算法【数据结构】
  • 测开笔记--Typescript: 文件复制到指定目录
  • 数字滚动vue-count-to
  • 扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件
  • Mysql面试题总结
  • 学习知识随笔(Django)
  • 基于element自动表格
  • Python基础语法之学习数据转换
  • 最新AI创作系统ChatGPT网站运营源码、支持GPT-4-Turbo模型,图片对话识图理解,支持DALL-E3文生图
  • Kotlin中常见的List使用
  • 汽车电子 -- 车载ADAS之LCA(变道辅助系统)
  • MongoDB——golang操作(链接,CURD,聚合)
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(十八)
  • 绿色能源守护者:光伏运维无人机
  • i已学赋能智慧教育时代的幼儿教育
  • [栈迁移+ret滑梯]gyctf_2020_borrowstack
  • PTA:用函数实现从数列中删除一个数