python学习-代码调试器

news2024/11/17 23:38:39

目录

  • 为什么学习调试器
  • Pycharm Debugger
    • 示例所用代码
    • 布局
    • 调试工具栏 Debug Bar
    • 程序控制工具栏
  • pdb
    • 查看源代码 l list
    • 查看当前函数源代码 ll longlist
    • 打印变量 p
    • 查看调用栈w where
    • 向上移动当前帧 u up
    • 向上移动当前帧 d down
    • 运行当前行代码,在第一个可以停止的位置停下 s step
    • 继续运行,直到当前函数的下一行或当前函数返回为止 n next
    • 运行直到下一个断点 c continue
    • 打印函数返回值 retval
    • 跳出循环(执行直到比当前行数大) unt until
    • 添加断点 b break
    • 启用/禁用断点 enable/disable
    • 修改代码
    • 清除断点 cl clear
    • 退出调试器 q quit
  • 参考


为什么学习调试器

大家平时是怎么调试代码的呢?我平时是这两种

  • 使用print打印变量,发布时再注释掉
  • 使用日志,设置控制台为DEBUG模式,发布时设置控制台为更严重级别,就不用一个个注释print

第一个方式需要侵入代码,且调试后需要注释,有的时候忘记注释了一个print,比较繁琐。第二个方式优雅了一些,但有的时候就是写的小脚本,不需要保存日志,比较麻烦。
这两个还有一些缺点,例如,打印的不够多时,还需要添加print或log,然后再次运行。所以,我们来学习一个更优雅的方式:使用调试器。

Pycharm Debugger

示例所用代码

net_tools.py

import aiohttp

async def get_resp(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            print(response.status)
            return await response.text()

main.py

import asyncio
from net_tools import get_resp

async def print_resp(url):
    res = await get_resp(url)
    print(res)

async def main():
    url_list = ["https://blog.csdn.net/lady_killer9/article/details/128891256","https://blog.csdn.net/lady_killer9/article/details/108763489"]
    for url in url_list:
       await asyncio.create_task(print_resp(url))

if __name__ == '__main__':
    asyncio.run(main())

布局

在这里插入图片描述
左侧一列为调试工具栏、调试工具栏右侧是帧、再右侧是变量显示区域、上侧是程序控制栏。默认是Debugger标签页,点击Console标签页可以查看程序的输出。
在这里插入图片描述

调试工具栏 Debug Bar

按钮

提示和快捷键

描述

重新启动

重新运行

Ctrl+F5

单击此按钮可停止当前应用程序并再次运行它。

恢复

继续程序

F9

当应用程序暂停时,单击此按钮可继续程序的执行,即运行到下一个断点。

暂停

暂停程序

Ctrl+Pause

单击此按钮可暂停程序执行。

停

停止

Ctrl+F2

单击此按钮可通过标准脚本在外部终止当前进程。shutdown

查看断点

查看断点

Ctrl+Shift+F8

单击此按钮可打开“断点”对话框,您可以在其中配置断点行为。

静音断点

禁用断点

使用此按钮可以切换断点状态。

“调试”工具窗口的工具栏中按下应用调试器静音断点该按钮时,项目中的所有断点都将禁用,图标将变为灰色:静音断点

可以暂时将项目中的所有断点静音以执行程序,而无需在断点处停止。

显示选项菜单

设置

单击此按钮可打开包含以下选项的菜单:

  • 内联显示值:选择此选项可启用内联调试功能,该功能允许在编辑器中查看变量用法旁边的变量值。

  • 按字母顺序对值进行排序:选择此选项可按字母顺序对“变量”窗格中的值进行排序

  • 会话完成时取消静音断点:选择此选项可在调试会话完成后重新启用所有禁用的断点。

  • 显示返回值:选择此选项可在步进时显示当前帧中已执行函数的返回值

  • 简化变量视图:选择此选项可将以下名称包含在“特殊变量”组中:

    • 所有具有 DUNDER 名称的变量。

    • 和 的所有实例。functionclassobjmodule

    • 所有 IPython 内部变量,如果已启动带有 IPython 的调试控制台。

  • 变量加载策略。您可以选择以下策略之一:

    • 同步:如果选择此检查命令,则显示的消息为 ,之后调试器将显示变量的值。Collecting data

    • 异步:如果选择此检查命令,则单独(异步)加载调试器中的变量。在这种情况下,如果加载变量需要很长时间,调试器会显示消息,如果变量太慢,则只有在调试器之后才会显示其值或消息。请注意建议切换到按需模式的警告消息。...Loading ValueLoading timed out

    • 按需:如果选择此检查命令,调试器将显示消息。单击它以启用加载。Show Value

    请注意,加载策略中的任何更改在重新运行调试过程后生效。

App general pin tab

Pin Tab

Click this button to pin or unpin the current tab. You may need to pin a tab to prevent it from closing automatically when the maximum number of tabs is reached in this window.

单击3次恢复按钮,可以看到ul变量是url_list中的第一个。
在这里插入图片描述
单击查看断点按钮可以查看所有断点。可以通过Enabled复选框来禁用/启用某一个断点。
在这里插入图片描述
单击静音断点禁用所有断点。
在这里插入图片描述
单击恢复继续执行程序,Console标签页可以看到结果。
在这里插入图片描述
单击设置按钮,可以看到有几个选项。
在这里插入图片描述

  • 内联显示变量值
  • 会话结束时取消禁止断点
  • 显示返回值
  • 简化的变量视图
  • 异步加载值

程序控制工具栏

按钮

提示和快捷键

描述

显示执行点

显示执行点

Alt+F10

单击此按钮可在编辑器中突出显示当前执行点,并在“帧”窗格中显示相应的堆栈

步过

跨过

F8

单击此按钮可执行程序,直到当前方法或文件中的下一行,跳过当前执行点引用的方法(如果有)。如果当前行是方法中的最后一行,则执行步骤将紧跟在此方法之后执行的行。

步入

步入

F7

单击此按钮可让调试器单步执行在当前执行点调用的方法。

强行步入

强行步入

Alt+Shift+F7

单击此按钮可使调试器单步执行当前执行点中调用的方法,即使要跳过此方法也是如此。

单步执行我的代码

单步执行代码

Alt+Shift+F7

单击此按钮可跳过单步执行库源代码,并专注于您自己的代码。

步出

Shift+F8

单击此按钮可使调试器从当前方法中单步执行,转到紧随其后的行。

运行到光标

运行到光标

Alt+F9

单击此按钮可恢复程序执行并暂停,直到执行点到达编辑器中当前光标位置的行。不需要断点。实际上,插入符号处为当前行设置了一个临时断点,一旦程序执行暂停,该断点就会被删除。因此,如果插入符号位于已执行的行,则程序将恢复以进一步执行,因为无法回滚到以前的断点。当您已深入单步执行方法序列并需要一次单步执行多个方法时,此操作特别有用。

如果为在将您带到指定行之前应执行的行设置了断点,则调试器将在遇到的第一个断点处暂停。

如果需要在特定行处使用某种临时断点,则使用此操作,其中程序执行不应中断。

计算表达式

计算表达式

Alt+F8

单击此按钮可 。计算表达式。

Pycharm版本不一样,按钮图标可能不同

单击显示执行点按钮可以看到帧显示main.py:9行,代码区域光标也显示在第9行

在这里插入图片描述
单击步入按钮,会进入调用的库的函数中。
在这里插入图片描述

单击单步执行我的代码按钮,会跳过导入的库,直接进入自己写的函数或者下一行
在这里插入图片描述

pdb

有的时候在无界面的服务器上或容器中调试,无法使用Pycharm就可以使用pdb了。
pdb有了两种使用方式,一种是添加断点后直接运行(侵入式)

import pdb
pdb.set_trace()

breakpoint()

以下示例使用代码如下
main.py

import asyncio
import pdb
from net_tools import get_resp

async def print_resp(url):
    res = await get_resp(url)
    pdb.set_trace()
    print(res)

async def main():
    url_list = ["https://blog.csdn.net/lady_killer9/article/details/128891256","https://blog.csdn.net/lady_killer9/article/details/108763489"]
    for url in url_list:
       pdb.set_trace()
       await asyncio.create_task(print_resp(url))

if __name__ == '__main__':
    asyncio.run(main())

net_tools.py

import aiohttp

async def get_resp(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            print(response.status)
            return await response.text()

frame:帧,pdb状态下会使用->代表当前帧

> e:\workspace\python_workspace\debug_test\main.py(13)main()
-> await asyncio.create_task(print_resp(url))
(Pdb) 

查看源代码 l list

如果不带参数,则列出当前行周围的 11 行,或继续前一个列表。
如果用 . 作为参数,则列出当前行周围的 11 行。
如果带有一个参数,则列出那一行周围的 11 行。
如果带有两个参数,则列出所给的范围中的代码;
如果第二个参数小于第一个参数,则将其解释为列出行数的计数。

(Pdb) l
  8  	async def main():
  9  	    url_list = ["https://blog.csdn.net/lady_killer9/article/details/128891256","https://blog.csdn.net/lady_killer9/article/details/108763489"]
 10  	    for url in url_list:
 11  	       import pdb
 12  	       pdb.set_trace()
 13  ->	       await asyncio.create_task(print_resp(url))
 14  	
 15  	if __name__ == '__main__':
 16  	    asyncio.run(main())
[EOF]

查看当前函数源代码 ll longlist

(Pdb) ll
  8  	async def main():
  9  	    url_list = ["https://blog.csdn.net/lady_killer9/article/details/128891256","https://blog.csdn.net/lady_killer9/article/details/108763489"]
 10  	    for url in url_list:
 11  	       import pdb
 12  	       pdb.set_trace()
 13  ->	       await asyncio.create_task(print_resp(url))

打印变量 p

p后面加上变量名即可

(Pdb) p url_list
['https://blog.csdn.net/lady_killer9/article/details/128891256', 'https://blog.csdn.net/lady_killer9/article/details/108763489']

查看调用栈w where

(Pdb) w
  e:\workspace\python_workspace\debug_test\main.py(16)<module>()
-> asyncio.run(main())
  c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\runners.py(43)run()
-> return loop.run_until_complete(main)
  c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(574)run_until_complete()
-> self.run_forever()
  c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(541)run_forever()
-> self._run_once()
  c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(1786)_run_once()
-> handle._run()
  c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\events.py(88)_run()
-> self._context.run(self._callback, *self._args)
> e:\workspace\python_workspace\debug_test\main.py(13)main()
-> await asyncio.create_task(print_resp(url))

可以看到调用栈,接下来运行

await asyncio.create_task(print_resp(url))

向上移动当前帧 u up

后面可加参数count,在堆栈回溯中,将当前帧向上移动 count 级

(Pdb) u
> c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\events.py(88)_run()
-> self._context.run(self._callback, *self._args)

向上移动当前帧 d down

后面可加参数count,在堆栈回溯中,将当前帧向下移动 count 级

(Pdb) d
> e:\workspace\python_workspace\debug_test\main.py(13)main()
-> await asyncio.create_task(print_resp(url))

运行当前行代码,在第一个可以停止的位置停下 s step

step在被调用的函数内部或在当前函数的下一行停下,所以可以用step进入函数

(Pdb) s
--Call--
> c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\tasks.py(345)create_task()
-> def create_task(coro):

继续运行,直到当前函数的下一行或当前函数返回为止 n next

next 和 step 之间的区别在于:step 进入被调用函数内部并停止,而 next (几乎)全速运行被调用函数,仅在当前函数的下一行停止。

(Pdb) n
> c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\tasks.py(350)create_task()
-> loop = events.get_running_loop()

运行直到下一个断点 c continue

(Pdb) c
200
> e:\workspace\python_workspace\debug_test\main.py(8)print_resp()
-> print(res)

打印函数返回值 retval

(Pdb) retval
None

跳出循环(执行直到比当前行数大) unt until

(Pdb) u
> c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\events.py(88)_run()
-> self._context.run(self._callback, *self._args)
(Pdb) u
> c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(1786)_run_once()
-> handle._run()
(Pdb) u
> c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(541)run_forever()
-> self._run_once()
(Pdb) c

接下来使用另外一种方式,去除断点后直接运行(非侵入式)

python3 -m pdb main.py

添加断点 b break

b后可以使用lineno 或function 参数设置断点,一个是行号,一个是函数名。不加参数时列出所有断点。
如果带有 lineno 参数,则在当前文件相应行处设置一个断点。
如果带有 function 参数,则在该函数的第一条可执行语句处设置一个断点。

(venv) E:\Workspace\python_workspace\debug_test>python -m pdb main.py
> e:\workspace\python_workspace\debug_test\main.py(1)<module>()
-> import asyncio
(Pdb) b 9
Breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9
(Pdb) b 10
Breakpoint 2 at e:\workspace\python_workspace\debug_test\main.py:10
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at e:\workspace\python_workspace\debug_test\main.py:9
2   breakpoint   keep yes   at e:\workspace\python_workspace\debug_test\main.py:10

启用/禁用断点 enable/disable

命令后加断点编号即可

(Pdb) disable 1
Disabled breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9
(Pdb) enable 1
Enabled breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9

修改代码

(Pdb) c
> e:\workspace\python_workspace\debug_test\main.py(10)main()
-> for url in url_list:
(Pdb) p url_list
['https://blog.csdn.net/lady_killer9/article/details/128891256', 'https://blog.csdn.net/lady_killer9/article/details/108763489']
(Pdb) url_list = ["https://www.baidu.com/s?tn=44004473_30_oem_dg&ie=utf-8&wd=lady_killer9"]
(Pdb) p url_list
['https://www.baidu.com/s?tn=44004473_30_oem_dg&ie=utf-8&wd=lady_killer9']

清除断点 cl clear

如果参数是 filename:lineno,则清除此行上的所有断点。
如果参数是空格分隔的断点编号列表,则清除这些断点。
如果不带参数,则清除所有断点(但会先提示确认),输入y或者n。

(Pdb) clear
Clear all breaks? y
Deleted breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9
Deleted breakpoint 2 at e:\workspace\python_workspace\debug_test\main.py:10
(Pdb) c
200
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>百度安全验证</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="format-detection" content="telephone=no, email=no">
    <link rel="shortcut icon" href="https://www.baidu.com/favicon.ico" type="image/x-icon">
    <link rel="icon" sizes="any" mask href="https://www.baidu.com/img/baidu.svg">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
    <link rel="stylesheet" href="https://ppui-static-wap.cdn.bcebos.com/static/touch/css/api/mkdjump_aac6df1.css" />
</head>
<body>
    <div class="timeout hide-callback">
        <div class="timeout-img"></div>
        <div class="timeout-title">网络不给力,请稍后重试</div>
        <button type="button" class="timeout-button">返回首页</button>
    </div>
    <div class="timeout-feedback hide-callback">
        <div class="timeout-feedback-icon"></div>
        <p class="timeout-feedback-title">问题反馈</p>
    </div>

<script src="https://ppui-static-wap.cdn.bcebos.com/static/touch/js/mkdjump_v2_21d1ae1.js"></script>
</body>
</html>

The program finished and will be restarted

退出调试器 q quit

(Pdb) q

思考题:
查看官方文档,使用第二种方式启用pdb时,如何给net_tools.py文件添加断点?
如何进入net_tools.py文件中的函数内部?

把答案打在评论区。。。

参考

Pycharm-debugtoolbar
python-pdb

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

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

相关文章

Selenium基础篇之八大元素定位方式

文章目录 前言一、如何进行元素定位&#xff1f;1.右击元素-检查2.F12-选择工具点击元素3.借助selenium IDE 二、八大元素定位方式1.ID1.1 方法1.2 举例1.3 代码1.4 截图 2.NAME2.1 方法2.2 举例2.3 代码2.4 截图 3.CLASS_NAME3.1 方法3.2 举例3.3 代码3.4 截图 4.TAG_NAME4.1 …

再也不用担心组件跨层级的数据共享和方法驱动了

文章目录 兄弟组件的传值和方法调用多个独立组件的数据共享和方法调用多个组件内的方法和数据互相驱动&#xff1a;eventBus多个组件的数据共享以及数据修改&#xff1a;vuex 项目中关于组件的使用经常会碰到这种情况&#xff1a;父子组件传和方法调用、兄弟组件的传值和方法调…

Selenium该如何实现微博自动化运营:关注、点赞、评论

目录 前言&#xff1a; Selenium 是什么&#xff1f; 一、核心代码 二、步骤分解 三、自动化运营常用工具 前言&#xff1a; 使用 Selenium 实现微博自动化运营&#xff0c;可以提高效率、减少工作量&#xff0c;下面讲解如何使用 Selenium 实现微博的关注、点赞和评论功…

webSocket 学习

引子 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它是 HTML5 中的一种新特性&#xff0c;能够实现 Web 应用程序和服务器之间的实时通信&#xff0c;比如在线聊天、游戏、数据可视化等。 相较于 HTTP 协议的请求-响应模式&#xff0c;使用 WebSocket 可以建…

JVM零基础到高级实战之Java内存区域虚拟机栈

JVM零基础到高级实战之Java内存区域虚拟机栈 JVM零基础到高级实战之Java内存区域虚拟机栈 文章目录 JVM零基础到高级实战之Java内存区域虚拟机栈前言JVM内存模型之虚拟机栈总结 前言 JVM零基础到高级实战之Java内存区域虚拟机栈 JVM内存模型之虚拟机栈 虚拟机栈是什么&#x…

Ansys Lumerical | 光纤布拉格光栅温度传感器的仿真模拟

说明 该示例演示了一种基于光纤布拉格光栅&#xff08;FBG&#xff09;的温度传感器&#xff0c;因为光纤折射率会随温度而变化&#xff0c;导致其布拉格波长发生偏移&#xff0c;所以可以被用作温度的测量。&#xff08;联系我们获取文章附件&#xff09; 综述 在本示例中要考…

java八股文-并发篇

并发篇 1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建&#xff0c;但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联 可运行 调用了 start …

在Linux上安装Zookeeper集群(zookeeper-3.5.9)

记录&#xff1a;455 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用zookeeper-3.5.9版本&#xff0c;在三台机器上&#xff0c;安装Zookeeper集群。 版本&#xff1a;zookeeper-3.5.9&#xff0c;CentOS 7.9,Linux kernel-5.4.218。 1.主机规划 目标&#xff1a…

接口自动化测试新玩法!Python构建mock服务让你的测试更加高效!

目录 引言 Flask mock接口开发示例 引言 Mock 即模拟&#xff0c;就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法&#xff0c;其最大的优势就是降级前后端耦合度&#xff0c; 使前端工程师可以不…

Alloy Tutorial(1)Alloy 基本使用

文章目录 构造一个 graph谓词undirected 无向图undirected2 无向图的第二种写法assertFact扩展 构造一个 graph In this workshop we are going to use Alloy to model graphs. Mathematically, recall that a graph is just a pair ⟨V, E⟩ where V is a set of vertices (a…

参数估计和假设检验的区别与联系

1.参数估计和假设检验的区别与联系 笔记来源&#xff1a; 参数估计与假设检验 参数估计和假设检验有什么区别&#xff1f; 1.1 联系 参数估计和假设检验是推断统计的两个组成部分&#xff0c;它们都是根据样本信息对总体的数量特征进行推断 下图来自《统计学图鉴》 参数估计…

详解WEB集群服务(LNMP+Nginx+Tomcat+Rewrite重写+七层反向代理+SNAT|DNAT策略)

实战项目演练 1.问题描述2.实验操作步骤2.1 CentOS 7-1客户端配置2.2 CentOS 7-2网关服务器配置2.3 CentOS 7-8 (Web1:Tomcat服务器)2.3.1 安装Tomcat服务器2.3.2 提供四层反向代理的动态页面 2.4 CentOS 7-9 (Nginx服务器)2.4.1 安装Nginx服务2.4.2 安装MySQL服务2.4.3 安装配…

基于Python的接口自动化-读写配置文件

目录 引言 configparser模块功能介绍 引言 在编写接口自动化测试脚本时&#xff0c;有时我们需要在代码中定义变量并给变量固定的赋值。为了统一管理和操作这些固定的变量&#xff0c;咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中&#xff0c;后续需要用到这…

如何在电脑上使用wink一键高清短视频

如何在电脑上使用wink一键高清优化短视频画质 文章目录 如何在电脑上使用wink一键高清优化短视频画质1.软件简介1.1痛点1.2解决方案 2.实际操作2.1准备工作2.1.1下载雷电模拟器2.1.2下载wink 2.2.安装软件2.2.1安装雷电模拟器2.2.2安装wink2.2.2.1在雷电模拟器中安装wink2.2.2.…

LeetCode 双周赛 106(2023/06/10)两道思维题

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入知识星球提问。 往期回顾&#xff1a;LeetCode 单周赛第 348 场 数位 DP 模版学会了吗&#xff1f; 双周赛 106 概览 T1. 判断一个数是否迷人&#xff08;Easy&#xff09; 标…

如何做企业发布会直播/企业发布会直播流程

1 .企业发布会直播流程图 2 .发布会解决方案 A .发布会直播前 B .发布会直播中 C .发布会直播后 如何做一场企业新品、产品发布会直播&#xff1f;流程图&#xff1a; 01 发布会直播前 专业全案策划 全面深入挖掘客户直播需求&#xff0c;拆解需求&#xff0c;制定全流程落地方…

Selenium 必了解—如何测试REST API

目录 前言&#xff1a; Web UI测试存在的问题&#xff1a; REST API测试&#xff1a; 依赖包 程序示例&#xff1a; 1-获取联系人 2-GET Request&#xff1a; 3-POST Request: 4- 编辑请求 5- 删除请求 前言&#xff1a; Selenium WebDriver 可以用于测试 Web 应用的…

深度学习框架(Pytorch)学习第1步:包管理系统Anaconda的安装

PyTorch是一种开源的深度学习框架&#xff0c;以出色的灵活性和易用性著称。 并且与机器学习开发者和数据科学家喜欢的Python高级编程语言兼容。 什么是PyTorch PyTorch是一种构建深度模型功能完备的框架。通常用于图像识别和语言处理等。 使用Python编写&#xff0c;学习和…

UI自动化测试之Airtest让你的测试工作如虎添翼!

本文我们讲解下Airtest的使用&#xff0c;主要学习目标有以下几点&#xff1a; &#xff08;1&#xff09;认识Airtest &#xff08;2&#xff09;了解Airtest能做什么 &#xff08;3&#xff09;Airtest安装及环境搭建 &#xff08;4&#xff09;掌握Airtest图形化api使用 &am…

【MySQL】记录的基本操作

文章目录 插入数据为表中所有字段插入数据为表中指定字段插入数据同时插入多条数据 更新数据删除数据TRUNCATE和DETELE的区别 查询数据 插入数据 为表中所有字段插入数据 基本语法 INSERT INTO 表名&#xff08;字段名1,字段名2,…) VALUES (值 1,值 2,…); 示例 # 准备一张表…