网易首页 > 网易号 > 正文 申请入驻

Python 内置函数:exec( )

0
分享至

内置函数 exec() 能够执行字符串形式的Python 代码。它与 eval() 类似,但 exec() 不仅限于表达式,可以执行任意的 Python 语句。这使得 exec() 在某些动态编程场景中极为有用,尤其是在需要动态生成代码、脚本或构建自定义 DSL(领域特定语言)时。

然而,和 eval() 一样,exec() 也存在着极高的安全风险,因为它允许执行任意代码。

一、函数语法

exec(object, globals=None, locals=None)

参数:

object:可以是字符串,也可以是代码对象。若是字符串,它应包含有效的 Python 代码(如语句或表达式)。

globals:可选。指定全局命名空间,用于执行代码时的全局变量。默认为当前作用域。

locals:可选。输出结尾的字符,默认是换行符 '\n',可设置为空字符串或其他字符串。

返回值:

exec() 不返回任何值。它直接执行传入的代码,但不会有显式的返回结果。如果需要获取执行结果,可以通过执行代码的副作用(如修改变量)来访问。

二、基本用法举例

1、执行单一的 Python 语句

code = "x = 10 + 20"
exec(code)
print(x)  # 输出:30

2、执行多个语句

code = """
a = 5
b = 10
result = a + b
"""
exec(code)
print(result)  # 输出:15

3、执行代码并使用指定的命名空间

global_scope = {}
local_scope = {"y": 5}

code = "result = y * 2"
exec(code, global_scope, local_scope)
print(local_scope["result"])  # 输出:10

4、动态定义函数

code = """
def greet(name):
    return 'Hello, ' + name
"""
exec(code)
print(greet("Alice"))  # 输出:Hello, Alice

三、典型应用场景

1、动态生成代码

exec() 可以在运行时动态地创建变量、函数、类等,适合用于需要动态构建代码的场景:

for i in range(3):
    exec(f"def func{i}(): print('This is function {i}')")

func0()  # 输出:This is function 0
func1()  # 输出:This is function 1
func2()  # 输出:This is function 2

2、自定义 DSL(领域特定语言

使用 exec() 可以实现简单的领域特定语言(DSL),使得用户可以动态输入代码并执行,类似于 SQL 或数学表达式的求值器。

# 自定义简单的数学表达式执行
expression = "3 * (5 + 2)"
exec(f"result = {expression}")
print(result)  # 输出:21

3、代码注入(危险)

尽管 exec() 可以让我们动态执行代码,但在面对不受信任的输入时,它极其危险。恶意的用户输入可能导致代码注入攻击。

# 用户输入(例如从网页表单)
user_input = "__import__('os').system('rm -rf /')"  # 恶意代码

exec(user_input)  # 会删除系统文件,造成灾难性后果

四、安全问题及替代方案

exec() 是非常强大的工具,但由于其执行任意 Python 代码的能力,它的安全风险非常大。尤其是在处理来自不受信任用户的输入时,绝对不能直接使用 exec()。

1、执行恶意代码

如果不加限制,攻击者可以通过注入恶意代码控制系统、窃取数据或执行其他有害操作。

2、数据泄露

exec() 执行代码时,可能会读取或修改系统中的敏感数据,造成隐私泄露。

3、文件操作

由于 exec() 能够调用 Python 的文件操作函数(如 open()、os.system() 等),恶意代码可以通过 exec() 执行文件删除、读取敏感文件等危险操作。

安全示例:限制执行环境

为了减少风险,可以使用如下方法限制执行的环境:

safe_globals = {"__builtins__": None}  # 禁用所有内建函数
code = "os.system('echo Hello World')"
exec(code, safe_globals)  # 将会引发 NameError,因为 os 未定义

然而,这种做法并不完全安全,exec() 仍然可以绕过这些限制执行恶意操作。因此,尽量避免使用 exec(),尤其是在处理来自不信任源的数据时。

4、替代方案

如果只是想动态执行某些操作,以下方法通常更为安全:

(1)使用 eval() 代替 exec()(仅适用于表达式计算,且需要严格验证输入)。

(2)使用 ast.literal_eval() 执行仅包含基本数据结构的字符串。

(3)使用专门的解析库(如 json.loads()、yaml.load() 等)来处理配置数据。

五、补充说明

1、避免使用 exec() 执行用户输入的代码。

2、限制执行环境,禁用内建函数和外部模块。

3、在需要动态执行代码时,考虑使用更安全的替代方案(如 eval()、ast.literal_eval())。

4、尽管 exec() 强大且灵活,但它的风险也意味着,只有在确实需要时,才应当考虑使用,并且要确保完全控制执行环境。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
二百多名军官被枪毙、撤职、处分,长津湖战役中失职的志愿军88师

二百多名军官被枪毙、撤职、处分,长津湖战役中失职的志愿军88师

云霄纪史观
2026-03-25 12:16:14
张雪峰现任妻子遭扒,曝其去年再婚有儿子,年轻漂亮还很清纯

张雪峰现任妻子遭扒,曝其去年再婚有儿子,年轻漂亮还很清纯

古希腊掌管松饼的神
2026-03-25 14:28:44
张雪峰去世,AC米兰官方发文致哀!他曾说:卡卡转会就像复旦生去了清华

张雪峰去世,AC米兰官方发文致哀!他曾说:卡卡转会就像复旦生去了清华

可乐谈情感
2026-03-25 10:28:28
伊朗最新回应:已被特朗普欺骗了两次,不想再被愚弄!3架F-15战机坠毁,特朗普最新回应:小意外!伊朗致函联合国,“176国传阅”

伊朗最新回应:已被特朗普欺骗了两次,不想再被愚弄!3架F-15战机坠毁,特朗普最新回应:小意外!伊朗致函联合国,“176国传阅”

每日经济新闻
2026-03-25 16:15:05
扒开张雪峰的家底才明白:他最厉害的不是报志愿,而是选对妻子

扒开张雪峰的家底才明白:他最厉害的不是报志愿,而是选对妻子

风起见你
2026-03-25 10:40:24
油价调整:注意,预计下调25元/吨,油价暂搁浅!

油价调整:注意,预计下调25元/吨,油价暂搁浅!

金投网
2026-03-25 11:01:14
面相骗不了人!早有人看穿张雪峰,如今全应验了

面相骗不了人!早有人看穿张雪峰,如今全应验了

手工制作阿歼
2026-03-25 12:13:13
遛狗遇伏,台“百亿赌王”在柬埔寨身中29枪

遛狗遇伏,台“百亿赌王”在柬埔寨身中29枪

枢密院十号
2026-03-24 22:00:29
张雪峰,倒在上市前夜

张雪峰,倒在上市前夜

帅真商业
2026-03-25 11:31:43
风暴来临前最后的宁静,达利欧发出重磅预警

风暴来临前最后的宁静,达利欧发出重磅预警

枫冷慕诗
2026-03-24 11:21:56
当“会造车的”遇上“懂技术的”,启境GT7就成了猎装市场破局者

当“会造车的”遇上“懂技术的”,启境GT7就成了猎装市场破局者

智谷趋势
2026-03-24 20:03:59
伊朗发起第80波打击

伊朗发起第80波打击

财联社
2026-03-25 11:16:07
岚图上市破局:稳健经营的行业范本,央国企高端新能源的突围之道

岚图上市破局:稳健经营的行业范本,央国企高端新能源的突围之道

汽车通讯社
2026-03-24 22:36:51
三万科普:张雪峰走了,但不是跑步的锅

三万科普:张雪峰走了,但不是跑步的锅

傅盛
2026-03-25 02:48:03
特朗普称已向伊朗提出和平方案,中方回应

特朗普称已向伊朗提出和平方案,中方回应

中国网
2026-03-25 16:04:21
黄仁勋罕见谈生死:希望在工作中突然离世,重申不信任“继任者计划”

黄仁勋罕见谈生死:希望在工作中突然离世,重申不信任“继任者计划”

界面新闻
2026-03-25 12:15:45
个人公众号“千问”停更近10年,近期接连遭阿里投诉均被驳回,号主:规避风险不发AI文章,如果我不发声,账号就不保了

个人公众号“千问”停更近10年,近期接连遭阿里投诉均被驳回,号主:规避风险不发AI文章,如果我不发声,账号就不保了

中国能源网
2026-03-25 13:53:05
好友曝张雪峰后事安排!3月28日在苏州举行追悼会,地点曝光

好友曝张雪峰后事安排!3月28日在苏州举行追悼会,地点曝光

180视角
2026-03-25 14:48:19
张雪峰去世真相!网友:偌大的公司靠他个人ip养活,早死是必然的

张雪峰去世真相!网友:偌大的公司靠他个人ip养活,早死是必然的

火山詩话
2026-03-25 09:18:58
手机放床头辐射伤身?央视实验给出答案:这样放手机,辐射降10倍

手机放床头辐射伤身?央视实验给出答案:这样放手机,辐射降10倍

天气观察站
2026-03-24 19:02:53
2026-03-25 17:12:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1806文章数 79关注度
往期回顾 全部

科技要闻

红极一时却草草收场,Sora宣布正式关停

头条要闻

女子为病重父亲找到失联34年挚友:两人加起来132岁

头条要闻

女子为病重父亲找到失联34年挚友:两人加起来132岁

体育要闻

35岁替补门将,凭什么入选英格兰队?

娱乐要闻

张雪峰经抢救无效不幸去世 年仅41岁

财经要闻

管涛:中东局势如何影响人民币汇率走势?

汽车要闻

智己LS8放大招 30万内8系旗舰+全线控底盘秀实力

态度原创

游戏
艺术
时尚
旅游
公开课

坚持讽刺内核!《GTA6》将拒绝真实品牌广告植入

艺术要闻

《百花谱》,这个春天画花不用愁!

告别黑白灰,春天穿“奶油色”真的很好看

旅游要闻

行走自贡:寻迹长滩河(双河口-响水洞)

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版