Python调试器实现断点系统
wuantov 2025-08-06 23:31 8 浏览
在软件开发过程中,调试是不可或缺的重要环节。断点系统作为调试器的核心功能,允许开发者在程序执行的特定位置暂停程序运行,检查变量状态、分析程序流程,从而快速定位和解决问题。
断点系统原理
断点系统的实现基于Python的sys.settrace()机制,这是Python提供的程序执行跟踪接口。当程序运行时,Python解释器会在每一行代码执行前调用跟踪函数,使我们能够监控和控制程序的执行流程。断点系统通过在特定行号设置标记,当程序执行到这些位置时自动暂停,为开发者提供检查程序状态的机会。
现代调试器通常支持多种类型的断点,包括行断点、条件断点、函数断点和异常断点。行断点是最基础的类型,在指定的代码行暂停执行。条件断点则更加智能,只有当指定条件满足时才会触发。函数断点在函数入口或出口处暂停,而异常断点在特定异常发生时激活。
核心断点类设计
断点系统的核心是断点管理器,负责存储、管理和执行断点逻辑。下面实现一个完整的断点类,包含断点的基本属性和行为控制机制。
class Breakpoint:
"""断点类,管理单个断点的所有属性和行为
Attributes:
filename (str): 文件路径
line_number (int): 行号
condition (str, optional): 条件表达式
temporary (bool): 是否为临时断点
enabled (bool): 断点是否启用
hit_count (int): 命中次数
ignore_count (int): 忽略次数
id (int): 断点唯一标识
"""
def __init__(self, filename, line_number, condition=None, temporary=False):
"""初始化断点
Args:
filename (str): 文件路径
line_number (int): 行号
condition (str, optional): 条件表达式
temporary (bool): 是否为临时断点
"""
self.filename = filename
self.line_number = line_number
self.condition = condition
self.temporary = temporary
self.enabled = True
self.hit_count = 0
self.ignore_count = 0
self.id = id(self) # 使用对象ID作为唯一标识
def should_break(self, frame, globals_dict, locals_dict):
"""判断是否应该在此断点停止
Args:
frame: 当前的执行帧
globals_dict: 全局变量字典
locals_dict: 局部变量字典
Returns:
bool: 如果应该在此断点停止返回True,否则返回False
"""
if not self.enabled:
return False
# 检查忽略次数
if self.ignore_count > 0:
self.ignore_count -= 1
return False
# 增加命中次数
self.hit_count += 1
# 检查条件
if self.condition:
try:
result = eval(self.condition, globals_dict, locals_dict)
return bool(result)
except Exception:
# 条件表达式求值出错时不中断
return False
return True
def enable(self):
"""启用断点"""
self.enabled = True
def disable(self):
"""禁用断点"""
self.enabled = False
def set_condition(self, condition):
"""设置断点条件
Args:
condition (str): 条件表达式
"""
self.condition = condition
def set_ignore_count(self, count):
"""设置忽略次数
Args:
count (int): 忽略次数
"""
self.ignore_count = count
def __str__(self):
"""返回断点的字符串表示"""
status = "enabled" if self.enabled else "disabled"
temp_str = " (temporary)" if self.temporary else ""
condition_str = f", condition: {self.condition}" if self.condition else ""
return (
f"Breakpoint {self.id} at {self.filename}:{self.line_number} "
f"({status}{temp_str}){condition_str}, hits: {self.hit_count}"
)
def __repr__(self):
"""返回断点的官方字符串表示"""
return (
f"Breakpoint(filename={self.filename!r}, line_number={self.line_number}, "
f"condition={self.condition!r}, temporary={self.temporary})"
)
调试器核心实现
调试器的核心功能围绕跟踪函数展开,该函数在每行代码执行前被调用。下面实现一个完整的调试器类,集成断点管理、程序控制和状态监控功能。
import sys
import os
from types import FrameType
from typing import Dict, Tuple, Optional
class Breakpoint:
"""断点类,管理单个断点的所有属性和行为
Attributes:
filename (str): 文件路径
line_number (int): 行号
condition (str, optional): 条件表达式
temporary (bool): 是否为临时断点
enabled (bool): 断点是否启用
hit_count (int): 命中次数
ignore_count (int): 忽略次数
id (int): 断点唯一标识
"""
def __init__(self, filename: str, line_number: int, condition: Optional[str] = None, temporary: bool = False):
"""初始化断点
Args:
filename (str): 文件路径
line_number (int): 行号
condition (str, optional): 条件表达式
temporary (bool): 是否为临时断点
"""
self.filename = filename
self.line_number = line_number
self.condition = condition
self.temporary = temporary
self.enabled = True
self.hit_count = 0
self.ignore_count = 0
self.id = id(self) # 使用对象ID作为唯一标识
def should_break(self, frame: FrameType, globals_dict: Dict, locals_dict: Dict) -> bool:
"""判断是否应该在此断点停止
Args:
frame: 当前的执行帧
globals_dict: 全局变量字典
locals_dict: 局部变量字典
Returns:
bool: 如果应该在此断点停止返回True,否则返回False
"""
if not self.enabled:
return False
# 检查忽略次数
if self.ignore_count > 0:
self.ignore_count -= 1
return False
# 增加命中次数
self.hit_count += 1
# 检查条件
if self.condition:
try:
result = eval(self.condition, globals_dict, locals_dict)
return bool(result)
except Exception:
# 条件表达式求值出错时不中断
return False
return True
def enable(self) -> None:
"""启用断点"""
self.enabled = True
def disable(self) -> None:
"""禁用断点"""
self.enabled = False
def set_condition(self, condition: str) -> None:
"""设置断点条件
Args:
condition (str): 条件表达式
"""
self.condition = condition
def set_ignore_count(self, count: int) -> None:
"""设置忽略次数
Args:
count (int): 忽略次数
"""
self.ignore_count = count
def __str__(self) -> str:
"""返回断点的字符串表示"""
status = "enabled" if self.enabled else "disabled"
temp_str = " (temporary)" if self.temporary else ""
condition_str = f", condition: {self.condition}" if self.condition else ""
return (
f"Breakpoint {self.id} at {self.filename}:{self.line_number} "
f"({status}{temp_str}){condition_str}, hits: {self.hit_count}"
)
def __repr__(self) -> str:
"""返回断点的官方字符串表示"""
return (
f"Breakpoint(filename={self.filename!r}, line_number={self.line_number}, "
f"condition={self.condition!r}, temporary={self.temporary})"
)
class PythonDebugger:
"""Python调试器主类,实现断点系统和程序控制"""
def __init__(self):
self.breakpoints: Dict[Tuple[str, int], Breakpoint] = {} # 存储断点,格式:{(filename, line): breakpoint}
self.step_mode: bool = False # 步进模式
self.step_into: bool = False # 步入模式
self.current_frame: Optional[FrameType] = None # 当前执行框架
self.running: bool = True # 程序运行状态
self.last_filename: Optional[str] = None
self.last_line: Optional[int] = None
def add_breakpoint(self, filename: str, line_number: int, condition: Optional[str] = None,
temporary: bool = False) -> bool:
"""添加断点到指定文件的指定行
Args:
filename: 文件名
line_number: 行号
condition: 条件表达式
temporary: 是否为临时断点
Returns:
bool: 是否成功添加断点
"""
# 标准化文件路径
filename = os.path.abspath(filename)
key = (filename, line_number)
if key in self.breakpoints:
print(f"断点已存在于 {filename}:{line_number}")
return False
breakpoint = Breakpoint(filename, line_number, condition, temporary)
self.breakpoints[key] = breakpoint
print(f"断点已设置: {breakpoint}")
return True
def remove_breakpoint(self, filename: str, line_number: int) -> bool:
"""移除指定位置的断点
Args:
filename: 文件名
line_number: 行号
Returns:
bool: 是否成功移除断点
"""
filename = os.path.abspath(filename)
key = (filename, line_number)
if key in self.breakpoints:
bp = self.breakpoints.pop(key)
print(f"断点已移除: {bp}")
return True
else:
print(f"未找到断点于 {filename}:{line_number}")
return False
def trace_function(self, frame: FrameType, event: str, arg) -> Optional[object]:
"""跟踪函数,在每行代码执行前调用
Args:
frame: 当前执行帧
event: 事件类型
arg: 事件参数
Returns:
返回跟踪函数本身或None
"""
if event != 'line':
return self.trace_function
filename = frame.f_code.co_filename
line_number = frame.f_lineno
# 检查是否有断点
key = (os.path.abspath(filename), line_number)
should_stop = False
# 检查断点
if key in self.breakpoints:
bp = self.breakpoints[key]
if bp.should_break(frame, frame.f_globals, frame.f_locals):
should_stop = True
print(f"断点命中: {bp}")
# 如果是临时断点,执行后删除
if bp.temporary:
self.breakpoints.pop(key)
# 检查步进模式
if self.step_mode and (filename != self.last_filename or line_number != self.last_line):
should_stop = True
self.step_mode = False
if should_stop:
self.current_frame = frame
self.debugger_console(frame)
self.last_filename = filename
self.last_line = line_number
return self.trace_function
def debugger_console(self, frame: FrameType) -> None:
"""调试器交互控制台
Args:
frame: 当前执行帧
"""
filename = frame.f_code.co_filename
line_number = frame.f_lineno
print(f"\n程序暂停于 {os.path.basename(filename)}:{line_number}")
while True:
try:
command = input("(Pdb) ").strip().lower()
if command in ['c', 'continue']:
break
elif command in ['s', 'step']:
self.step_mode = True
self.step_into = True
break
elif command in ['n', 'next']:
self.step_mode = True
self.step_into = False
break
elif command in ['l', 'list']:
self.show_source_context(filename, line_number)
elif command.startswith('p '):
var_name = command[2:]
self.print_variable(frame, var_name)
elif command in ['locals']:
self.print_locals(frame)
elif command in ['globals']:
self.print_globals(frame)
elif command in ['q', 'quit']:
sys.exit(0)
elif command in ['h', 'help']:
self.show_help()
else:
print("未知命令,输入 'h' 查看帮助")
except KeyboardInterrupt:
print("\n使用 'q' 退出调试器")
except EOFError:
break
def show_source_context(self, filename: str, line_number: int, context: int = 5) -> None:
"""显示当前位置的源代码上下文
Args:
filename: 文件名
line_number: 行号
context: 显示上下文行数
"""
try:
with open(filename, 'r', encoding='utf-8') as f:
lines = f.readlines()
start = max(0, line_number - context - 1)
end = min(len(lines), line_number + context)
for i in range(start, end):
marker = "-->" if i + 1 == line_number else " "
print(f"{marker} {i + 1:4d}: {lines[i].rstrip()}")
except FileNotFoundError:
print(f"无法读取文件: {filename}")
def print_variable(self, frame: FrameType, var_name: str) -> None:
"""打印指定变量的值
Args:
frame: 当前执行帧
var_name: 变量名
"""
try:
if var_name in frame.f_locals:
value = frame.f_locals[var_name]
print(f"{var_name} = {repr(value)}")
elif var_name in frame.f_globals:
value = frame.f_globals[var_name]
print(f"{var_name} = {repr(value)}")
else:
print(f"变量 '{var_name}' 未找到")
except Exception as e:
print(f"无法获取变量值: {e}")
def print_locals(self, frame: FrameType) -> None:
"""打印所有局部变量
Args:
frame: 当前执行帧
"""
print("局部变量:")
for name, value in frame.f_locals.items():
if not name.startswith('__'):
print(f" {name} = {repr(value)}")
def print_globals(self, frame: FrameType) -> None:
"""打印全局变量(排除内置变量)
Args:
frame: 当前执行帧
"""
print("全局变量:")
for name, value in frame.f_globals.items():
if not name.startswith('__') and not callable(value):
print(f" {name} = {repr(value)}")
def show_help(self) -> None:
"""显示帮助信息"""
help_text = """
调试器命令:
c, continue - 继续执行程序
s, step - 步进执行(进入函数)
n, next - 单步执行(不进入函数)
l, list - 显示当前位置源代码
p <var> - 打印变量值
locals - 显示所有局部变量
globals - 显示全局变量
q, quit - 退出程序
h, help - 显示此帮助信息
"""
print(help_text)
def start_debugging(self) -> None:
"""启动调试器"""
sys.settrace(self.trace_function)
print("调试器已启动")
def stop_debugging(self) -> None:
"""停止调试器"""
sys.settrace(None)
print("调试器已停止")
# 使用示例
if __name__ == "__main__":
# 创建调试器实例
debugger = PythonDebugger()
# 设置断点(假设我们有一个test.py文件)
debugger.add_breakpoint("test.py", 10)
# 启动调试
debugger.start_debugging()
# 这里通常会执行你想要调试的代码
# 例如: import test; test.main()
# 停止调试
debugger.stop_debugging()
运行结果:
断点已设置: Breakpoint 4824425424 at /Users/hlg/PycharmProjects/pythonProject/test.py:10 (enabled), hits: 0
调试器已启动
调试器已停止
实际应用
为了展示断点系统的实际应用效果,下面创建一个完整的测试程序。这个示例将演示如何使用调试器设置不同类型的断点,包括普通断点和条件断点,并展示调试过程中的交互操作。
import sys
import os
from types import FrameType
from typing import Dict, Tuple, Optional
class Breakpoint:
"""断点类,管理单个断点的所有属性和行为
Attributes:
filename (str): 文件路径
line_number (int): 行号
condition (str, optional): 条件表达式
temporary (bool): 是否为临时断点
enabled (bool): 断点是否启用
hit_count (int): 命中次数
ignore_count (int): 忽略次数
id (int): 断点唯一标识
"""
def __init__(self, filename: str, line_number: int, condition: Optional[str] = None, temporary: bool = False):
"""初始化断点
Args:
filename (str): 文件路径
line_number (int): 行号
condition (str, optional): 条件表达式
temporary (bool): 是否为临时断点
"""
self.filename = filename
self.line_number = line_number
self.condition = condition
self.temporary = temporary
self.enabled = True
self.hit_count = 0
self.ignore_count = 0
self.id = id(self) # 使用对象ID作为唯一标识
def should_break(self, frame: FrameType, globals_dict: Dict, locals_dict: Dict) -> bool:
"""判断是否应该在此断点停止
Args:
frame: 当前的执行帧
globals_dict: 全局变量字典
locals_dict: 局部变量字典
Returns:
bool: 如果应该在此断点停止返回True,否则返回False
"""
if not self.enabled:
return False
# 检查忽略次数
if self.ignore_count > 0:
self.ignore_count -= 1
return False
# 增加命中次数
self.hit_count += 1
# 检查条件
if self.condition:
try:
result = eval(self.condition, globals_dict, locals_dict)
return bool(result)
except Exception:
# 条件表达式求值出错时不中断
return False
return True
def enable(self) -> None:
"""启用断点"""
self.enabled = True
def disable(self) -> None:
"""禁用断点"""
self.enabled = False
def set_condition(self, condition: str) -> None:
"""设置断点条件
Args:
condition (str): 条件表达式
"""
self.condition = condition
def set_ignore_count(self, count: int) -> None:
"""设置忽略次数
Args:
count (int): 忽略次数
"""
self.ignore_count = count
def __str__(self) -> str:
"""返回断点的字符串表示"""
status = "enabled" if self.enabled else "disabled"
temp_str = " (temporary)" if self.temporary else ""
condition_str = f", condition: {self.condition}" if self.condition else ""
return (
f"Breakpoint {self.id} at {self.filename}:{self.line_number} "
f"({status}{temp_str}){condition_str}, hits: {self.hit_count}"
)
def __repr__(self) -> str:
"""返回断点的官方字符串表示"""
return (
f"Breakpoint(filename={self.filename!r}, line_number={self.line_number}, "
f"condition={self.condition!r}, temporary={self.temporary})"
)
class PythonDebugger:
"""Python调试器主类,实现断点系统和程序控制"""
def __init__(self):
self.breakpoints: Dict[Tuple[str, int], Breakpoint] = {} # 存储断点,格式:{(filename, line): breakpoint}
self.step_mode: bool = False # 步进模式
self.step_into: bool = False # 步入模式
self.current_frame: Optional[FrameType] = None # 当前执行框架
self.running: bool = True # 程序运行状态
self.last_filename: Optional[str] = None
self.last_line: Optional[int] = None
def add_breakpoint(self, filename: str, line_number: int, condition: Optional[str] = None, temporary: bool = False) -> bool:
"""添加断点到指定文件的指定行
Args:
filename: 文件名
line_number: 行号
condition: 条件表达式
temporary: 是否为临时断点
Returns:
bool: 是否成功添加断点
"""
# 标准化文件路径
filename = os.path.abspath(filename)
key = (filename, line_number)
if key in self.breakpoints:
print(f"断点已存在于 {filename}:{line_number}")
return False
breakpoint = Breakpoint(filename, line_number, condition, temporary)
self.breakpoints[key] = breakpoint
print(f"断点已设置: {breakpoint}")
return True
def remove_breakpoint(self, filename: str, line_number: int) -> bool:
"""移除指定位置的断点
Args:
filename: 文件名
line_number: 行号
Returns:
bool: 是否成功移除断点
"""
filename = os.path.abspath(filename)
key = (filename, line_number)
if key in self.breakpoints:
bp = self.breakpoints.pop(key)
print(f"断点已移除: {bp}")
return True
else:
print(f"未找到断点于 {filename}:{line_number}")
return False
def trace_function(self, frame: FrameType, event: str, arg) -> Optional[object]:
"""跟踪函数,在每行代码执行前调用
Args:
frame: 当前执行帧
event: 事件类型
arg: 事件参数
Returns:
返回跟踪函数本身或None
"""
if event != 'line':
return self.trace_function
filename = frame.f_code.co_filename
line_number = frame.f_lineno
# 检查是否有断点
key = (os.path.abspath(filename), line_number)
should_stop = False
# 检查断点
if key in self.breakpoints:
bp = self.breakpoints[key]
if bp.should_break(frame, frame.f_globals, frame.f_locals):
should_stop = True
print(f"断点命中: {bp}")
# 如果是临时断点,执行后删除
if bp.temporary:
self.breakpoints.pop(key)
# 检查步进模式
if self.step_mode and (filename != self.last_filename or line_number != self.last_line):
should_stop = True
self.step_mode = False
if should_stop:
self.current_frame = frame
self.debugger_console(frame)
self.last_filename = filename
self.last_line = line_number
return self.trace_function
def debugger_console(self, frame: FrameType) -> None:
"""调试器交互控制台
Args:
frame: 当前执行帧
"""
filename = frame.f_code.co_filename
line_number = frame.f_lineno
print(f"\n程序暂停于 {os.path.basename(filename)}:{line_number}")
while True:
try:
command = input("(Pdb) ").strip().lower()
if command in ['c', 'continue']:
break
elif command in ['s', 'step']:
self.step_mode = True
self.step_into = True
break
elif command in ['n', 'next']:
self.step_mode = True
self.step_into = False
break
elif command in ['l', 'list']:
self.show_source_context(filename, line_number)
elif command.startswith('p '):
var_name = command[2:]
self.print_variable(frame, var_name)
elif command in ['locals']:
self.print_locals(frame)
elif command in ['globals']:
self.print_globals(frame)
elif command in ['q', 'quit']:
sys.exit(0)
elif command in ['h', 'help']:
self.show_help()
else:
print("未知命令,输入 'h' 查看帮助")
except KeyboardInterrupt:
print("\n使用 'q' 退出调试器")
except EOFError:
break
def show_source_context(self, filename: str, line_number: int, context: int = 5) -> None:
"""显示当前位置的源代码上下文
Args:
filename: 文件名
line_number: 行号
context: 显示上下文行数
"""
try:
with open(filename, 'r', encoding='utf-8') as f:
lines = f.readlines()
start = max(0, line_number - context - 1)
end = min(len(lines), line_number + context)
for i in range(start, end):
marker = "-->" if i + 1 == line_number else " "
print(f"{marker} {i + 1:4d}: {lines[i].rstrip()}")
except FileNotFoundError:
print(f"无法读取文件: {filename}")
def print_variable(self, frame: FrameType, var_name: str) -> None:
"""打印指定变量的值
Args:
frame: 当前执行帧
var_name: 变量名
"""
try:
if var_name in frame.f_locals:
value = frame.f_locals[var_name]
print(f"{var_name} = {repr(value)}")
elif var_name in frame.f_globals:
value = frame.f_globals[var_name]
print(f"{var_name} = {repr(value)}")
else:
print(f"变量 '{var_name}' 未找到")
except Exception as e:
print(f"无法获取变量值: {e}")
def print_locals(self, frame: FrameType) -> None:
"""打印所有局部变量
Args:
frame: 当前执行帧
"""
print("局部变量:")
for name, value in frame.f_locals.items():
if not name.startswith('__'):
print(f" {name} = {repr(value)}")
def print_globals(self, frame: FrameType) -> None:
"""打印全局变量(排除内置变量)
Args:
frame: 当前执行帧
"""
print("全局变量:")
for name, value in frame.f_globals.items():
if not name.startswith('__') and not callable(value):
print(f" {name} = {repr(value)}")
def show_help(self) -> None:
"""显示帮助信息"""
help_text = """
调试器命令:
c, continue - 继续执行程序
s, step - 步进执行(进入函数)
n, next - 单步执行(不进入函数)
l, list - 显示当前位置源代码
p <var> - 打印变量值
locals - 显示所有局部变量
globals - 显示全局变量
q, quit - 退出程序
h, help - 显示此帮助信息
"""
print(help_text)
def start_debugging(self) -> None:
"""启动调试器"""
sys.settrace(self.trace_function)
print("调试器已启动")
def stop_debugging(self) -> None:
"""停止调试器"""
sys.settrace(None)
print("调试器已停止")
def fibonacci(n):
"""计算斐波那契数列,用于调试演示"""
if n <= 1:
return n
a, b = 0, 1
for i in range(2, n + 1):
temp = a + b # 断点1 (line 25)
a = b
b = temp # 条件断点 (line 28)
return b
def main():
"""主函数,演示调试器使用"""
debugger = PythonDebugger()
# 设置断点
current_file = os.path.abspath(__file__)
debugger.add_breakpoint(current_file, 25) # 在fibonacci函数内设置断点
debugger.add_breakpoint(current_file, 28, condition="i > 5") # 条件断点
# 启动调试器
debugger.start_debugging()
print("开始执行斐波那契计算...")
result = fibonacci(10)
print(f"结果: {result}")
# 停止调试器
debugger.stop_debugging()
if __name__ == "__main__":
main()
运行结果:
断点已设置: Breakpoint 4830795152 at /Users/hlg/PycharmProjects/pythonProject/test.py:25 (enabled), hits: 0
断点已设置: Breakpoint 4830795216 at /Users/hlg/PycharmProjects/pythonProject/test.py:28 (enabled), condition: i > 5, hits: 0
调试器已启动
开始执行斐波那契计算...
结果: 55
调试器已停止
总结
断点系统是现代调试器的核心组件,通过Python的sys.settrace()机制可以实现功能丰富的调试工具。本文介绍的实现包含了断点管理、程序控制、变量检查等基本功能,为理解调试器工作原理提供了完整的参考。在实际项目中,可以进一步扩展这个系统,添加图形界面、性能分析、内存监控等高级功能。随着Python生态系统的发展,调试工具也在不断演进,为开发者提供更加便捷和强大的调试体验。
相关推荐
- UV 工具深度解析与实践指南
-
一个工具可以替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等一、工具概述1.1核心定位UV是由Rust编写的新一代Python生态...
- MCP 官方文档:开发你自己的MCP —— MCP 天气服务
-
一、MCP简介MCP是一个开放协议,它为应用程序向LLM提供上下文的方式进行了标准化。你可以将MCP想象成AI应用程序的USB-C接口。就像USB-C为设备连接各种外设和配件提...
- 一文使你彻底学会FastAPI
-
什么是API?想象一下,你在一家餐馆,你想点一些食物。为了得到你想要的食物,你和服务员交谈,告诉他们你的订单。然后,服务员将您的订单带到厨房,厨师会根据您的要求准备食物。最后,服务员把你的食物带回...
- 手把手教你进行Python虚拟环境配置
-
/1前言/咱们今天就来说一下Python的虚拟环境,可能有的小伙伴会疑惑,Python的虚拟环境有什么用呢?接下来我们一起来探讨一下。/2虚拟环境的作用/咱们今天就来说一下Python的虚拟环...
- LangGraph集成DeepSeek实现AI对话
-
本文介绍如何使用AI开源框架LangGraph,集成调用DeepSeek大模型,实现AI对话功能,并给出Python示例代码。一、LangGrap是什么LangGrap:LangGrap是一个用于构...
- 一文带你掌握Python自带venv虚拟环境
-
前边几篇文章,我们介绍了如何使用conda来管理python的虚拟环境。这时可能有人会有疑问,既然这个功能这么有用,那有官方提供的解决方案吗?其实是有的,在python3.3版本及以后,...
- Pytorch详细安装过程
-
1、安装anaconda官网(https://www.anaconda.com/products/distribution#Downloads)下载,使用管理员身份运行(不使用似乎也没事)这里选择Ju...
- Python简介与开发环境搭建详细教程
-
1.1Python简介与开发环境搭建详细教程一、Python语言简介1.Python的核心特点2.Python的应用领域表1.1Python主要应用领域领域典型应用常用库Web开发网站后端D...
- Python开发中的虚拟环境管理
-
Python开发中,虚拟环境管理帮助隔离项目依赖,避免不同项目之间的依赖冲突。虚拟环境的作用隔离依赖:不同项目可能需要不同版本的库,虚拟环境可以为每个项目创建独立的环境。避免全局污染:全局安装的库可...
- Python项目创建全流程指南
-
以下是创建Python项目的超详细步骤指南,涵盖从环境配置到项目部署的全流程:一、环境准备安装PythonO官网下载:访问python.org下载最新稳定版O验证安装:终端输入pyth...
- LangChain开发MCP Server和MCP Client
-
本文介绍了如何通过LangChain实现MCP调用。通过模拟一个简单的算术计算器,基于MCPServer运行,并使用MCPClient进行调用。最终,通过集成DeepSeek大...
- 怎么给虚拟环境安装pdfplumber
-
1.找到虚拟环境激活脚本位置你的虚拟环境在C:\Users\shiqi\PycharmProjects\pythonProject2\.venv路径下,激活脚本Activate.ps1(Pow...
- Python调试器实现断点系统
-
在软件开发过程中,调试是不可或缺的重要环节。断点系统作为调试器的核心功能,允许开发者在程序执行的特定位置暂停程序运行,检查变量状态、分析程序流程,从而快速定位和解决问题。断点系统原理断点系统的实现基于...
- Python从放弃到入门:公众号历史文章爬取为例谈快速学习技能
-
这篇文章不谈江流所专研的营销与运营,而聊一聊技能学习之路,聊一聊Python这门最简单的编程语言该如何学习,我完成的第一个Python项目,将任意公众号的所有历史文章导出成PDF电子书。或许我这个Py...
- 能跑源码,还提供数据集:这里有一个入门企业级验证码识别项目
-
机器之心专栏作者:kerlomz网上关于验证码识别的开源项目众多,但大多是学术型文章或者仅仅是一个测试demo,那么企业级的验证码识别究竟是怎样的呢?1.前言网上关于验证么识别的开源项目众多,但大...
- 一周热门
- 最近发表
- 标签列表
-
- 修改ip地址 (28)
- 静态ip更换 (2)
- 指定ip切换 (12)
- ip库ip切换 (4)
- 淘宝店铺采集 (14)
- 微服务治理 (4)
- phash (7)
- mongo find (24)
- math保留两位小数 (21)
- cmd ip (15)
- 手机网络ip动态 (33)
- 随机更改ip地址 (7)
- drop column (23)
- navicat16 注册机 (25)
- crosscheck archivelog all (3)
- jm资源 (2)
- read by other session (10)
- python gui库 (21)
- 企业微信使用 (31)
- 知识付费源码五网合一 (25)
- 模糊查询sql (6)
- ip地址切换 (24)
- gc buffer busy acquire (7)
- 海外节点 (5)
- pycharm2020.2永久激活 (25)