而后来的版本中( Python2.6 之后),都以绝对导入为默认使用的导入方式。 使用绝对路径和相对路径各有利弊: 当你在开发维护自己的项目时,应当使用相对路径导入,这样可以避免硬编码带来的麻烦。...__import__ 的妙用 在 Python 中使用 import 关键字来实现模块/包的导入,可以说是基础中的基础。...更合适的做法是,将这些插件以配置的方式,写在配置文件中,然后由代码去读取你的配置,动态导入你要使用的插件,即灵活又方便,也不容易出错。...对于最高层级模块,第二个参数为 None,但对于子模块或子包,第二个参数为父包 __path__ 属性的值。如果相应的 __path__ 属性无法访问,将引发 ModuleNotFoundError。...ok >>> my_info.name # 验证可以取得到变量 'Python编程时光' 至此,我实现了一个简易的可以导入远程服务器上的模块的导入器。
__loader__ __loader__设置为导入在加载模块时使用的加载程序对象。这个特定的模块在_frozen_importlib模块中定义,并且是用于导入内置模块的内容。...np = __import__('numpy') # Same as doing 'import numpy as np' __debug__ 这是 Python 中的一个全局常量值,几乎总是设置为...为什么这是一个功能有很长的技术原因,它涉及元类等高级主题,所以不幸的是,我不会解释为什么它存在。...让我通过解释Python如何运行你的代码来解释这一点。 1. 获取源文件,并解析为语法树。保证语法正确。 2. 将语法树编译为字节码。...现在,由于上面的“编译为字节码”步骤在导入模块时需要花费大量时间,因此Python将字节码存储(编组)到.pyc文件中,并将其存储在名为__pycache__的文件夹中。
而后来的版本中( Python2.6 之后),都以绝对导入为默认使用的导入方式。 使用绝对路径和相对路径各有利弊: 当你在开发维护自己的项目时,应当使用相对路径导入,这样可以避免硬编码带来的麻烦。...__import__ 的妙用 在 Python 中使用 import 关键字来实现模块/包的导入,可以说是基础中的基础。...# 使用 import .. as .. import pandas as pd # 使用 __import__ pd = __import__('pandas') 上面我说 __import__...对于最高层级模块,第二个参数为 None,但对于子模块或子包,第二个参数为父包 __path__ 属性的值。如果相应的 __path__ 属性无法访问,将引发 ModuleNotFoundError。...ok >>> my_info.name # 验证可以取得到变量 'Python编程时光' 至此,我实现了一个简易的可以导入远程服务器上的模块的导入器。
在python中支持反射机制的函数有getattr()、setattr()、delattr()、exec()、eval()、__import__,这些函数都可以执行字符串。...b = exec("aa = 21") print(b) # None,exec返回值为None print(aa) # 21,exec执行了赋值语句,并定义了aa变量 执行复杂语句...setattr(x, 'y', v) is equivalent to ``x.y = v'' """ pass 将一个特殊值设置给object对象的name属性,相当于x.y = v...__("config") print(a.KEYWORD) config是一个py脚本-config.py,内部有一个变量KEYWORD,我们要通过其他py模块来导入这个文件,使用__import__我们就可以把它导入为一个对象...其实通过源码注释我们就知道了,__import__(A.B),如果fromlist为空,返回的是A包,如果不为空,则返回其子包B。
语法: __import__(name, globals=None, locals=None, fromlist=(), level=0) name[必须]:模块名称 globals - 全局变量集合...,默认为None locals - 局部变量集合,默认为None fromlist - 是否导入子模块,看上去是导入模块的列表。...但实际是一个判断条件,只要设置为非空的值,且模块名称是带有子模块的,将导入子模块。例如:sys.path。...当不设置时,返回sys,如果设置为非空值,则返回ntpath(path模块) level - 绝对或者相对导入 此处我们做个简单的验证,通过__import__实现和import一样的导入能力。...我是三十一,感谢各位朋友
0x00 前言 反射,可以理解为利用字符串的形式去对象中操作成员属性和方法 反射的这点特性让我联想到了exec函数,也是把利用字符串的形式去让Python解释器去执行命令 Python Version...: 3.5+ 解释Python的反射,先提一个简单的需求,现在我有一个简易的网站,由两个文件组成,一个是具体执行操作的commons.py文件,一个是入口文件index.py,现在我需要在入口文件中设置...那现在我的网站内容变多了,在commons.py中有100个页面操作,那么相对应的我在index.py中也要使用if else 对这100个页面函数进行手动指定。 有了Python?...能体会到__import__的作用了吗,就是把字符串当做模块去导入。...import 'sys' 和 import sys 是不一样的,不信你执行一下~~要想导入字符串'sys'只能通过__import__('sys')的方式导入 等等,还没完,我的网站进一步细化分工,现在又多了一层目录结构
简介 在实际项目中,我们可能需要在执行代码的过程中动态导入包并执行包中的相应内容,通常情况下,我们可能会将所需导入的包及对象以字符串的形式传入,例如test.test.run,下面将介绍如何动态导入。...__(name,globals=None,locals=None,fromlist=(),level=0)-> module 含义:导入模块。...globals: 当前范围的全局变量,正常设置为globals()。 locals:当前范围的局部变量,正常不需要使用,设置为locals()。...fromlist: 控制导入的包,例_import__('a.B',…)在fromlist为空时返回包a,但在fromlist不为空时,返回其子模块B,理论上只要fromlist不为空,则导入的是整个的...补充 关于importlib模块,还有一个方法我们需要去注意一下,就是reload方法,但我们在代码执行过程中动态的修改了某个包的内容时,想要立即生效,可以使用reload方法去重载对应的包即可。
,我们仍然可以借助内置的函数 __import__() 来导入标准库,比如 eval("__import__('os').system('ls')", {}) >>> eval("__import__(...其实仍然不安全。 原因是我们依然可以使用 Python 内部的一些类,还可以自己构造字节码,请慢慢向下看。...Python 的运行过程就是首先通过 compile 构建一个字节对象,得到代码的字节码,之后根据不同的字节码进行不同的操作,假如我们可以构造 Python 的字节码对象,那几乎可以使用 eval 来执行任何我们想要的结果...__name__ == 'bytes' ][0].fromhex('650064008301a0016401a101460064025300'),('os', 'ls', None),('__import...__' is not defined 注意,eval 里面还可以使用 eval, 伤心的是,加上参数 {'__builtins__':{}} 后仍然会报错,说明 __import__ 在 code 对象层面依然是无法绕过的
import 和“__import__”都是用来导入module的,但是二者还是有所不同, 可以查看帮助文档来了解其不同....上面描述了import 做的两步工作,首先是 查找一个模块,然后初始化这个模块,我个人对这一步的理解是这样的: 首先是根据sys.path的值,在相应的目录下查找以module name 命名的.pyc...再通过help(__import__) 查看其帮助,我们可以看到如下的片段: __import__(name, globals=None, locals=None, fromlist=(), level...这里可以看到 __import__ 是一个方法,这是__builtins__ 模块内置的一个方法,返回值是一个module,所以可以通过 __import__(ModuleName).Method的方式来使用...import 导入模块之后,就在相应的namespace 中存在了,除非明确用del 从当前的namespace中移出,否则始终可以访问到; 而用__import__ 导入,返回的是一个 模块,可以引用这个模块
但是,如果我想影响外部作用域,怎么办? 为此,可以在使用关键词 nonlocal ,让它来告诉解释器:你不是要在局部作用域中定义一个新变量,而是要修改闭包作用域(外围作用域)中的变量。...可以导入 builtins 模块,并查看该作用域中的所有对象: >>> import builtins >>> dir(builtins) # 显示内容从略 由于某些未知原因,Python 在全局命名空间中默认将内置模块显示为...__ 的作用在于导入模块的时候,被设置为导入对象。...在内部,这差不多就是 Python 对导入语句的处理(但在C语言中更直接)。 __debug__ 在 Python 中,这是一个全局常量,几乎总是被设置为 True 。...在导入模块时,将源码“编译为字节码”要花费一定时间,而后,Python 将字节码存储到 .pyc 文件中,并将其存储在名为 __pycache__ 的文件夹中。
我用例子简要说明一下: ? reload 的用法比较有意思,假如沙箱导入了os模块,但是删除了system方法,强行使用system执行命令会报错。...,可以通过读文件交给exec执行的方式导入包。...有的沙箱,为了防止你导入敏感包,会将sys.modules置为None。 以os 为例,沙箱将sys.modules['os']置为None,用户如果想import os 就会报错。 #!.../usr/bin/python##沙箱import syssys.modules['os'] = None ### 用户代码 import os 报错 为什么会报错?...,可以简单理解为bash,因此是可以执行命令的。
一般情况下,使用 import 语句导入模块已经够用的。 但是在一些特殊场景中,可能还需要其他的导入方式。 下面我会一一地给你介绍。 2....使用 __import__ __import__ 函数可用于导入模块,import 语句也会调用函数。...其定义为: __import__(name[, globals[, locals[, fromlist[, level]]]]) 参数介绍: name (required): 被加载 module 的名称...使用 execfile 在 Python 2 中有一个 execfile 函数,利用它可以用来执行一个文件。...远程导入模块 我在这篇文章里(深入探讨 Python 的 import 机制:实现远程导入模块),深入剖析了导入模块的内部原理,并在最后手动实现了从远程服务器上读取模块内容,并在本地成功将模块导入的导入器
写个小例子: 通过这个例子可以很清楚的看到,我用自己写的cut函数,替换了系统的 __import__函数,在进行import 的时候,代码逻辑真的走到了我的cut函数。...在写上一句话的时候,我一直在想,我为什么不是直接用 __import__代替 globals()['__builtins__']....import__的函数,在cut函数中5:9是我自己做的PrintHook,10:14 是在import的过程中,Cut掉PrintHook15:20 是为了保证执行我提交的代码走except的时候,导入...traceback不会报错出问题,影响下面的导入25:27 就是为了完成正常的导入了28 把自己构造的Cut塞到内置对象里30行引发一个异常,确保自己的代码在cut内置对象__import__之后走except...禁止导库可能发生在比如新浪sae,导入sae模块之后可以读取数据库账号密码主机端口等信息。
= getattr(commons, "f1") >>> target_func >>> target_func() 'F1' 通过设置默认值可以避免获取不到方法时报错...# 设置一个默认值为None >>> target_func = getattr(commons, "f1f1f1", None) >>> target_func >>> 通过getattr获取模块中的全局变量..., name, value) 根据字符串的形式去一个对象中设置成员 设置全局变量 # 获取commons内的Name变量 >>> getattr(commons, "Name", None) # 在commons...模块中设置一个全局变量Name,值为Ansheng >>> setattr(commons, "Name", "YangWen") # 获取commons内的Name变量 >>> getattr(commons..., "Name", None) 'YangWen' getattr结合lambda表达式设置一个函数 >>> setattr(commons, "as", lambda : print("as")) >
一般情况下,使用 import 语句导入模块已经够用的。 但是在一些特殊场景中,可能还需要其他的导入方式。 下面我会一一地给你介绍。 2....使用 __import__ __import__ 函数可用于导入模块,import 语句也会调用函数。...其定义为: __import__(name[, globals[, locals[, fromlist[, level]]]]) 参数介绍: name (required): 被加载 module 的名称...使用 execfile 在 Python 2 中有一个 execfile 函数,利用它可以用来执行一个文件。...http 服务(为了方便,我仅在本地进行演示),并且手动编辑一个名为 my_info 的 python 文件,如果后面导入成功会打印 ok。
1.简介在实际项目中,我们可能需要在执行代码的过程中动态导入包并执行包中的相应内容,通常情况下,我们可能会将所需导入的包及对象以字符串的形式传入,例如test.test.run,下面将介绍如何动态导入。...,locals=None,fromlist=(),level=0)-> module含义:导入模块。...globals: 当前范围的全局变量,正常设置为globals()。locals:当前范围的局部变量,正常不需要使用,设置为locals()。...fromlist: 控制导入的包,例_import__('a.B',…)在fromlist为空时返回包a,但在fromlist不为空时,返回其子模块B,理论上只要fromlist不为空,则导入的是整个的...补充关于importlib模块,还有一个方法我们需要去注意一下,就是reload方法,但我们在代码执行过程中动态的修改了某个包的内容时,想要立即生效,可以使用reload方法去重载对应的包即可。
in position 1: ordinal not in range(128),python没办法处理非ascii编码的,此时需要自己设置将python的默认编码,一般设置为utf8的编码格式。...此时再执行sys.getdefaultencoding()就会发现编码已经被设置为utf8的了,但是在解释器里修改的编 码只能保证当次有效,在重启解释器后,会发现,编码又被重置为默认的ascii了,那么有没有办法一次...utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。...当需要的时候,Python根据电脑默认的locale设置将字节转化成字符。 在Mac OX上默认的编 码是UTF-8,但是在别的系统上,大部分是ASCII。...在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码.
在Python中,如果要以动态方式导入模块,可以执行以下操作: module = __import__('module_name') 如果要导入子模块,你可能认为这只是一个简单的问题: module =...之后的import pkg.mod可以这样使用pkg.mod.func(),因为import语句引入了本地的模块pkg,这是一个具有mod属性的模块对象。...但是如果mod和mod2在该模块pkg中尚未导入,那将无法生效。...__import__函数需要知道mod和mod2是它可以访问的名称,以便它可以查看他们是否是模块并且尝试导入他们。...总结 __import__函数中的fromlist实际上是没有具体含义的,你可以理解为它只是一种标记,当它不为空的时候,import将为我们导入前面所写的字符串中最右边的模块。
,可以使用import.现在有这样的需求,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?...imp = input(“请输入你想导入的模块名:”) CC = __import__(imp) 這种方式就是通过输入字符串导入你所想导入的模块 CC.f1() # 执行模块中的f1...f = getattr(dd,inp_func,None)#作用:从导入模块中找到你需要调用的函数inp_func,然后返回一个该函数的引用.没有找到就烦会None f() # 执行该函数 上面我们就实现了...当然,上面还存在一点点小问题:那就是我的模块名有可能不是在本级目录中存放着。有可能是如下图存放方式: ? 那么这种方式我们该如何搞定呢?...看下面代码: dd = __import__("lib.text.commons") #这样仅仅导入了lib模块 dd = __import__("lib.text.commons",fromlist