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

python 动态导入文件的方法

时间:2023-01-05 17:45:40浏览次数:35  
标签:run name python module 导入 print import 动态

简介

在实际项目中,我们可能需要在执行代码的过程中动态导入包并执行包中的相应内容,通常情况下,我们可能会将所需导入的包及对象以字符串的形式传入,例如test.test.run,下面将介绍如何动态导入。
假设存在如下包:
image
其中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以内的内容,示例如下:
    存在如下包
    image
module = import_module(name="..test2", package="test3.test3")
print(module)
print(getattr(module, "run"))
print(getattr(module, "count"))

# 结果
<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/xy-bot/p/17028390.html

相关文章

  • Python用Lstm神经网络、离散小波转换DWT降噪对中压电网电压时间序列预测
    全文链接:http://tecdat.cn/?p=31149原文出处:拓端数据部落公众号分析师:YuxuanXia对于电力公司来说,对局部放电的准确预测可以显著降低人力物力成本。据调查,80%的输电设备......
  • python cron croniter优化封装标准-支持秒级 , ?
    一、基本方法,用python得知cron表达式"""计算定时任务下次运行时间schedstr:定时任务时间表达式timeFormatstr:格式为"%Y-%m-%d%H:%M"queryTimesint:查询下次运行次......
  • 用Python实现Socket编程
    SocketServer端和SocketClient端传输解析服务端和客户端的关系如下所示:1.SocketServer绑定IP地址和端口,并开始监听端口Server=socket.socket()Server.bind(("127.......
  • 为什么Python中的re.compile()输入要用raw string(r'')?
    在re这一模块的官方文档的解释如下Regularexpressionsusethebackslashcharacter('')toindicatespecialformsortoallowspecialcharacterstobeusedwitho......
  • Python 函数
    一.函数的初识函数:以功能(完成一件事)为导向,登录,注册,len一个函数就是一个功能。随调随用函数的优势1.减少了代码的重复性。2.增强了代码的可读性 二.函数的结构和调用......
  • 用Python来做一个简单的学生管理系统(附源码)
    小学妹说要毕业了,学了一学期Python等于没学,现在要做毕设做不出来,让我帮帮她,晚上去她家吃夜宵。当时我心想,这不是分分钟的事情,还要去她家,男孩子晚上不要随便出门,要学会......
  • 基于OpenCV DNN模块给黑白老照片上色(附Python/C++源码)
    导读本文给大家分享一个用OpenCVDNN模块给黑白老照片上色的实例,并给出Python和C++版本源码。 背景介绍    这个项目是基于在加利福尼亚大学,伯克利,RichardZhang,Phil......
  • makefile生成静/动态库
    通过makefile生成静态库和动态库目录树➜app_hellotree-h.├──[280]app_hello.c├──[218]app_hello.h└──[997]makefile0directories,3f......
  • IPython快捷键操作和魔术命令
    快捷键操作tab补全ctrl-c中断运行的代码ctrl-l清空屏幕ctrl-u删除当前行所有文本ctrl-p用当前输入的文本搜索之前的命令ctrl-n用当前输入的文本搜索之后的命......
  • 用python得知 cron表达式-执行时间
    #!/user/bin/python3#-*-coding:utf-8-*-#@Author:zhaoruixiao#@Datetime:2023/1/514:30#@Software:PyCharm#@File:cron.py"""workfor$用python得......