首页 > 编程语言 >python中动态导入文件的方法

python中动态导入文件的方法

时间:2023-04-06 16:56:00浏览次数:47  
标签:run name python module 导入 print import 动态

1.简介

在实际项目中,我们可能需要在执行代码的过程中动态导入包并执行包中的相应内容,通常情况下,我们可能会将所需导入的包及对象以字符串的形式传入,例如test.test.run,下面将介绍如何动态导入。
假设存在如下包:

在这里插入图片描述
其中test.py的内容如下:

count = 1


def run():
    print("run")

下面,我们将使用test.test2.run来动态导入run方法

一、使用内置的__import__方法导入相应的包

module = __import__(
    "test2.test", globals=globals(), locals=locals(), fromlist=["run"]
)
print(module)
print(getattr(module, "run"))
print(getattr(module, "count"))


# 结果
<module 'test2.test' from 'c:\\Users\\ts\\Desktop\\日报\\2023.1.5\\test2\\test.py'>
<function run at 0x000002EC1CB9B250>
1
__import__(name,globals=None,locals=None,fromlist=(),level=0)-> module

含义:导入模块。因为此函数是供Python解释器使用的,而不是一般用途,所以最好使用importlib.import_module()以编程方式导入模块。

  • name:需要导入的模块的名称,包含全路径。
  • globals: 当前范围的全局变量,正常设置为globals()。
  • locals:当前范围的局部变量,正常不需要使用,设置为locals()。
  • fromlist: 控制导入的包,例_import__('a.B',…)在fromlist为空时返回包a,但在fromlist不为空时,返回其子模块B,理论上只要fromlist不为空,则导入的是整个的name的包。
  • level:判断路径是绝对的还是相对的,0是绝对的,正数是相当于当前模块要搜索的父目录的数量。

二、使用importlib.import_module进行导入

from importlib import import_module

module = import_module(name="test2.test")
print(module)
print(getattr(module, "run"))
print(getattr(module, "count"))

import_module(name, package=None)
  • name: 需要导入的包名。
  • package: 需要相对导入的包名称,目前发现设置package后,name只能设置package以内的内容,示例如下:

存在如下包
在这里插入图片描述

module = import_module(name="..test2", package="test3.test3")
print(module)
print(getattr(module, "run"))
print(getattr(module, "count"))
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
# 结果
<module 'test3.test2' from 'c:\\Users\\ts\\Desktop\\日报\\2023.1.5\\test3\\test2.py'>
<function run at 0x0000024665C00310>
1

上述结果导入了test3.test2,name只能设置package以内的包。

三、直接使用exec拼接代码执行(不推荐)

str_data = "test2.test"


exec(
    "import {} as t\n\
\
print(t.run())\n\
print(t.count)\n".format(
        str_data
    )
)

上述方式不推荐,其实就是相当于本地导入然后将代码作为参数添加到exec的参数中。

补充

关于importlib模块,还有一个方法我们需要去注意一下,就是reload方法,但我们在代码执行过程中动态的修改了某个包的内容时,想要立即生效,可以使用reload方法去重载对应的包即可。

标签:run,name,python,module,导入,print,import,动态
From: https://www.cnblogs.com/djdjdj123/p/17293329.html

相关文章

  • opencv-python 4.12. 模板匹配
    理论模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV附带了一个函数cv.matchTemplate()。它只是在输入图像上滑动模板图像(如在2D卷积中),并比较模板图像下的输入图像的模板和补丁。在OpenCV中实现了几种比较方法。它返回一个灰度图像,其中每个像素表示该像素的......
  • 通过python控制windows窗口的关闭和显示
    代码:importwin32gui,win32con,win32apiimportos,sys,reimportctypesimporttimedefshowWindow(hwnd):#展示窗口,以下几行代码都可以唤醒窗口win32gui.ShowWindow(hwnd,win32con.SW_SHOW)win32gui.ShowWindow(hwnd,win32con.SW_SHOWNA)win32gu......
  • python面向对象基础
    1.__str__def__str__(self):return'****'print对象时,打印的为__str__函数返回的值2.__del__()def__del__(self):#pass当删除对象时,将会自动调用__del__函数(删除对象:delobj)python继承:classA(B):pass其中A继承Bpython3+classA(object):pass任......
  • python3使用seaborn生成带有扰动点的分组箱型图
    不分组箱型图importjsonimportseabornassnsimportmatplotlib.pyplotaspltfig=plt.figure(figsize=(20,5))sns.set(style="darkgrid")xData=[]yData=[]zData=[]withopen('./files/1.txt',encoding='utf-8-sig')asf:......
  • python 打包及发布
    打包pythonsetup.pybdist_wheel需要进行C++编译,因此在执行上述命令之前请确保已经安装了【VisualStudio(Windows)】、【GCC(Linux)】、【XCode(Mac)】编译器。发布先安装一下twine:python-mpipinstalltwinetwineuploaddist/*这时候它会提示你输入pypi的账号密码没......
  • 20230406-python-yaml文件操作
               ......
  • 导入jar包到本地的maven仓库
    当我们需要用maven来管理依赖但是又没有在线的仓库可用时,可以直接导入到本地仓库来管理依赖。在cmd中执行一下命令:mvninstall:install-file"-Dfile=testjar1-1.2-SNAPSHOT.jar""-DgroupId=com.test.test""-DartifactId=testjar1""-Dversion=1.2-SNAPSHOT""-Dpackaging=......
  • python实现各种算法详解,以及时间复杂度
    python实现各种排序1.快速排序1:首先取序列第一个元素为基准元素pivot=R[low]。i=low,j=high。2:从后向前扫描,找小于等于pivot的数,如果找到,R[i]与R[j]交换,i++。3:从前往后扫描,找大于pivot的数,如果找到,R[i]与R[j]交换,j--。4:重复2~3,直到i=j,返回该位置mid=i,该位置正好为pivot......
  • Python的函数和方法如何区分呢?
    结论>>>:无论是函数还是方法都用def关键字来定义方法:只要是自动传值都是方法、由谁来调用、会把自身传入函数:有几个值就传几个值否则会报错目录一、详细介绍函数和方法二、用几个关键字来判断三、通过代码小案例验证一、详细介绍函数和方法1.函数Python中的函数其实就是......
  • 2023.04.06 - 使用mixin动态混入,对vue组件中的数据做兼容经验总结(xp)
    业务场景:在一个高拍仪的硬件设备中,厂家给了两套不同的API,分别支持winXP和winXP以上版本的系统,而这两套API的实现方式截然不同,一套使用的是http通信,一套是使用scoket通信,方法的调用自然也是不同。我需要在同一组件兼容这两套代码。这种需求下很明显,我除了修改组件里的函数方法,......