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

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


RelativeImport:

python 复制代码
__version__='1.1.0'
__author__='Ls_Jan'


import os
import sys
import inspect

def 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.frame
	fileName=info.filename
	varG=frame.f_globals

	if(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.whlpip install RelativeImport-1.1-py3-none-any.whl,建议去github查看详细操作(毕竟如果github都上不去那轮子更不可能下载的了。
  • github项目链接:https://github.com/Ls-Jan/Python_RelativeImport/tree/main

参考:


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

相关推荐
量子炒饭大师19 分钟前
【C++入门】零域终端的虚空指针协议——【nullptr】还在为编译器给NULL匹配为int而头疼?nullptr给予你全新的字面量!
开发语言·c++·nullptr
edisao21 分钟前
一。星舰到底改变了什么?
大数据·开发语言·人工智能·科技·php
阿豪只会阿巴25 分钟前
【多喝热水系列】从零开始的ROS2之旅——Day10 话题的订阅与发布1:Python
开发语言·c++·python·ubuntu·ros2
Frank Castle1 小时前
【C语言】详解C语言字节打包:运算符优先级、按位或与字节序那些坑
c语言·开发语言
kk哥88991 小时前
分享一些学习JavaSE的经验和技巧
java·开发语言
橙露1 小时前
时间序列分析实战:用 Python 实现股票价格预测与风险评估
人工智能·python·机器学习
2501_940315261 小时前
【无标题】1.17给定一个数将其转换为任意一个进制数(用栈的方法)
开发语言·c++·算法
神云瑟瑟1 小时前
看langchain理解python中的链式调用
python·langchain·链式调用
栈与堆1 小时前
LeetCode 21 - 合并两个有序链表
java·数据结构·python·算法·leetcode·链表·rust
CCPC不拿奖不改名1 小时前
循环神经网络RNN:整数索引→稠密向量(嵌入层 / Embedding)详解
人工智能·python·rnn·深度学习·神经网络·自然语言处理·embedding