Python exec() 函数初探

你好🖖,我是简讯!一枚野生程序员。热爱编程,但目前的工作与编程毫无关系。

正在尝试各种副业,目前有做:

  • 红包封面商城
  • 中视频计划

想要零成本一起参与红包封面商城的可以看这篇文章:副业实践|如何利用红包封面打造副业?

编辑器的话 Neovim 多一点。如果你也喜欢使用 Nvim,我们可以一起交流。

我的 Nvim 配置:自用 neovim 配置。

个人公众号经常会分享一些编程相关的文章,还有一些我已经操作过可以实际上手的副业项目。

欢迎关注:爱生活爱扣钉。

函数 exec() 是 Python 中的一个内置函数,可以动态执行一段 Python 代码。它接收一个参数,即包含要执行的 Python 代码的字符串。相比于 eval,exec 可以执行更复杂的 Python 代码。代码可以是任何有效的 Python 代码,包括赋值、控制结构和函数定义。

下面是 exec() 函数的一般语法:

exec(object[, globals[, locals]])

object 参数是一个包含要执行的 Python 代码的字符串。可选的 globals 和 locals 参数允许你提供代表全局和局部命名空间的字典,exec() 将在这些命名空间中运行目标代码。

exec() 的基本用法

让我们从使用 exec() 函数执行一条简单 Python 语句的基本示例开始:

exec('print("Hello, world!")')

在本例中,exec() 函数将包含 Python 语句 print("Hello, world!") 的字符串作为参数。语句执行后,会在控制台中打印出字符串 “Hello, world!”。

您还可以使用 exec() 执行更复杂的 Python 代码,例如多语句或函数定义:

code = '''
x = 42
print("The answer is:", x)
'''exec(code)def square(x):return x ** 2exec('result = square(5)')
print(result) #Output: The answer is: 42

在第一个示例中,我们定义了一个变量 x 并打印其值。在第二个示例中,我们定义了一个函数 square(),然后以 5 为参数调用该函数。

需要注意的是,result 变量是在函数 exec() 的本地命名空间中创建的,我们可以在字符串之外访问它。

使用 exec() 时涉及到命名空间

如前所述,函数 exec() 的 globals 和 locals 参数允许您定义执行代码的全局和局部命名空间。

这在很多情况下都很有用,比如当你需要在特定上下文中执行代码时,或者当你想限制执行代码对某些变量的访问时。

例如,您有一个字典,希望将其用作某些执行代码的全局命名空间:

variables = {'a': 1, 'b': 2, 'c': 3}
code = '''
print("a + b + c =", a + b + c)
'''exec(code, variables) #Output: a + b + c = 6

在本例中,我们定义了一个变量字典 variables 和一串 Python 代码 code。然后,我们将这两个参数传递给函数 exec(),并将 variables 作为 globals 参数。

代码执行时,会使用 variables 字典中的 a、b 和 c 值。

还可以使用 locals 参数为执行的代码定义本地命名空间。例如:

code = '''
x = 5
y = 10
print("x + y =", x + y)
'''exec(code, {}, {'x': 1, 'y': 2}) #Output: x + y = 15

在这个示例中,我们定义了一串 Python 代码 code 并将它与一个空的 globals 字典和一个包含变量 x 和 y 的 locals 字典一起传递给函数 exec()。代码执行时,将使用 locals 字典中的 x 和 y 值,而不是全局命名空间。

使用 exec() 需要考虑安全因素

虽然 exec() 函数在动态执行 Python 代码时很强大,但如果不小心使用,它也会带来安全风险。由于 exec() 可以执行任意代码,如果攻击者能够在字符串参数中注入恶意代码,就可以利用它。

要降低这种风险,必须验证和净化传递给 exec() 的任何输入,尤其是来自用户输入或外部 API 等不可信任来源的输入。这里有一些有助于确保 exec() 代码的安全提示:

  • 在将用户输入传递给 exec() 之前,始终对其进行验证。例如,您可以使用正则表达式或其他验证技术来确保输入只包含安全字符,而不包含任何恶意代码。

  • 避免使用 exec() 执行来自不可信任来源的代码。如果必须执行外部代码,请考虑使用沙箱环境或 Lua 等安全语言。

  • 使用一组受限的内置函数和模块来限制执行代码的能力。例如,可以使用 ast 模块中的 restricted_eval() 函数来限制所执行代码的允许语法和语义。

  • 使用单独的进程或容器运行 exec() 代码,以限制任何恶意代码的影响。例如,可以使用 subprocess 模块,在具有受限权限的单独进程中运行代码。

在本文中,我们介绍了 Python 中 exec() 函数的基本用法和语法,简单涉及到一些高级主题,例如命名空间和安全注意事项。对于动态执行 Python 代码来说,exec() 是一个强大的工具,但要谨慎和安全地使用它。

一定要验证并且处理传递给 exec() 的任何输入,考虑使用沙箱环境或受限的内置函数集来限制执行代码的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/227061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

for-each循环优先于传统的for循环

在大多数情况下,使用 for-each 循环(也称为增强型 for 循环)比传统的 for 循环更加简洁和方便。它提供了一种更直观的方式来遍历集合或数组中的元素。以下是一个例子,展示了 for-each 循环优于传统 for 循环的情况: i…

AI智能配音助手微信小程序前后端源码支持多种声音场景选择

大家好今天给大家带来一款配音小程序 ,这款小程序支持多种不同声音和场景的选择更人性化, 比如说支持各地区的方言,英文,童声呀等等、 另外也支持男声女声的选择,反正就是模板那些非常的多 当然啦音量,语调,语速那些都是可以DIY跳转的哟,所以说这一款小程…

生信算法4 - 获取overlap序列索引和序列的算法

生信序列基本操作算法 建议在Jupyter实践,python版本3.9 1. 获取overlap序列索引和序列的算法实现 # min_length 最小overlap碱基数量3个 def getOverlapIndexAndSequence(a, b, min_length3):""" Return length of longest suffix of a matching…

python每日学11:xpath的使用与调试

背景:最近在使用selenium 模拟浏览器作一些常规操作,在使用selenium的过程中接触到的一种定位方法,叫xpath, 这里说一下使用心得。 首先,我觉得如果只是简单使用的话是不用详细了解具体的语法规则的。 一、xpath怎么用&#xff1…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用,导致密码忘记了,这可咋整? 第1步:取出SD卡 将树莓派关机,移除sd卡,使用读卡器,插入到你的电脑。 第2步:编辑 cmdline.txt 在PC上打开SD卡根目录,启动…

PyQt5系列

基本使用 1、创建应用,初始化UI界面,创建布局盒子 # -*- coding: utf-8 -*- # Creator: zhu # Time: 2023-12-13 import xlwt import sys, base64, xlrd, re, datetime from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QApplication, QW…

windows下类Unix模拟环境,msys2,mingw,gcc的安装与环境配置

windows下常用的类Unix模拟环境: git fow windows:git等mingw:打包了gcc等编译器cygwin:大而全的类Unix环境支持msys2:自带大量预编译的软件包,提供pacman软件管理工具,能安装Unix下大部分软件…

039:我自己的 ostream_iterator

描述 程序填空输出指定结果 #include <iostream> #include <list> #include <string> using namespace std;template <class T1,class T2> void Copy(T1 s,T1 e, T2 x) {for(; s ! e; s,x)*x *s; }template<class T> class myostream_iteraot…

【星环云课堂大数据实验】kafka消息发布与订阅

文章目录 一、Kafka概述二、实验环境三、实验准备四、实验目的五、实验步骤5.1、创建Kafka Topic5.2、Kafka消息发布5.3、Kafka消息订阅 六、实验感悟 一、Kafka概述 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。该项目的目标是为处理实…

内存的管理、扩充、存储保护、地址转换、分配和回收

一、 内存的存储保护 1.1 上、下限寄存器方式&#xff1a; 上、下限寄存器&#xff08;Limit Registers&#xff09;&#xff1a;这是一种硬件级别的内存保护机制。每个进程都有一对上、下限寄存器&#xff0c;用于定义该进程能够访问的内存范围。上限寄存器存储进程能够访问的…

【Android12】WindowManagerService架构分析

Android WindowManagerService架构分析 WindowManagerService(以下简称WMS) 是Android的核心服务。WMS管理所有应用程序窗口(Window)的Create、Display、Update、Destory。 因为Android系统中只有一个WMS&#xff08;运行在SystemServer进程&#xff09;&#xff0c;可以称其为…

快宝技术:连接无代码开发,API集成提升电商营销和用户运营效率

无代码开发&#xff1a;创新的启航 快宝技术自2012年成立至今&#xff0c;一直是无代码开发领域的佼佼者。通过无代码开发平台&#xff0c;快宝技术旨在降低技术门槛&#xff0c;并使非技术人员能够轻松创建和部署应用程序。这不仅使得快递末端软件开发变得高效和便捷&#xf…

vue3.0项目搭建

一、安装vue3脚手架 卸载vue2脚手架 npm uninstall -g vue-cli清除缓存 npm cache clen --force安装最新脚手架 npm install -g vue/cli查看脚手架版本 vue -V 二、构建项目 创建项目 vue create 项目名选择配置 自定义配置&#xff0c;回车 上下键选择Linter / Formatter&a…

深入探索:Python 中 Scipy 的信号处理技术

写在开头 信号处理作为数字信号处理领域的关键技术&#xff0c;涵盖了从信号获取、传输、存储到最终应用的一系列处理步骤。在这篇博客中&#xff0c;我们将深入探讨Python中Scipy库在信号处理领域的应用。首先&#xff0c;我们会简要概述信号处理的基本概念&#xff0c;随后引…

DC-2靶场

DC-2 下载地址&#xff1a;DC and Five86 Series Challenges - Downloads​编辑https://www.five86.com/downloads.html DC-2环境配置&#xff1a;解压后在vm虚拟机点击左上方文件-->打开-->选择解压后的DC-2。把kali和DC-2的网路适配器都改成NAT模式 flag1 首先进行主…

【教程】从零开始的ORB-SLAM3的安装与配置

引言 最近项目需求需要接触vslam&#xff0c;博主选择从ORB-SLAM3下手并且记录下安装的基本流程。不得不说&#xff0c;这安装流程就像二大娘的裹脚布。 大致环境前提&#xff1a;Ubuntu20.04 一、ORB-SLAM3的源码下载 1、首先&#xff0c;为了方便管理文件&#xff0c;我们…

GDB调试技巧实战--commands(断点回调)

commands的介绍 直接看gdb的help:commands会在关联的断点断住时被执行。 (gdb) help commands Set commands to be executed when a breakpoint is hit. Give breakpoint number as argument after "commands". With no argument, the targeted breakpoint is the …

面向对象三大特征之二:继承

继承的快速入门 什么是继承&#xff1f; Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类与另一个类建立起父子关系 继承的特点 子类能继承父类的非私有成员&#xff08;成员变量、成员方法&#xff09; 继承后对象的创建 子类的对象是由…

MyBatis Plus 大数据量查询优化

大数据量操作的场景大致如下&#xff1a; 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时&#xff0c;我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数据时&#xff0c;如果一下子将数…