是我以前写的老文章的升级版,本质上使用exec
和sys.path
实现相对路径导入。
RelativeImport:
__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]