-
【注意事项】 里写了支持 Python(CPython、PyPy) 那怎么指定服务器用PyPy解释我的.py脚本呢?
-
要在Python中绘制一束烟花,我们可以使用matplotlib库来创建动画效果。1. 安装依赖库首先,确保你已经安装了matplotlib和numpy库。如果没有安装,可以使用以下命令进行安装:bashpip install matplotlib numpy2. 编写代码pythonimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimation# 设置画布fig, ax = plt.subplots()ax.set_xlim(-10, 10)ax.set_ylim(0, 20)# 初始化烟花的粒子num_particles = 100positions = np.zeros((num_particles, 2)) # 每个粒子的位置 (x, y)velocities = np.zeros((num_particles, 2)) # 每个粒子的速度 (vx, vy)# 初始化烟花爆炸的位置explosion_position = np.array([0.0, 10.0])# 初始化粒子的速度和方向angles = np.linspace(0, 2 * np.pi, num_particles)speeds = np.random.uniform(5, 10, num_particles)velocities[:, 0] = speeds * np.cos(angles) # vxvelocities[:, 1] = speeds * np.sin(angles) # vy# 绘制烟花的粒子scatter = ax.scatter(positions[:, 0], positions[:, 1], c='blue', s=10)# 更新函数,用于动画的每一帧def update(frame): global positions, velocities # 更新粒子的位置 positions += velocities # 模拟重力效果,y方向速度逐渐减小 velocities[:, 1] -= 0.1 # 更新散点图的位置 scatter.set_offsets(positions) # 逐渐减小粒子的大小,模拟消失效果 sizes = scatter.get_sizes() scatter.set_sizes(np.maximum(0, sizes - 0.1)) return scatter,# 创建动画ani = FuncAnimation(fig, update, frames=200, interval=50, blit=True)# 显示动画plt.show()3. 代码解释初始化画布:我们使用matplotlib创建了一个画布,并设置了x轴和y轴的范围。初始化粒子:我们创建了100个粒子,每个粒子的初始位置都在烟花爆炸的中心点(0, 10)。每个粒子的速度方向是随机的,速度大小也是随机的。更新函数:update函数用于更新每一帧中粒子的位置和速度。粒子的位置会根据速度进行更新,并且y方向的速度会逐渐减小,模拟重力效果。粒子的大小也会逐渐减小,模拟烟花粒子逐渐消失的效果。动画:使用FuncAnimation创建动画,每一帧都会调用update函数来更新粒子的位置和大小。显示动画:最后使用plt.show()显示动画。4. 运行结果运行代码后,你会看到一个烟花爆炸的动画效果。烟花从中心点爆炸,粒子向四周扩散,并逐渐消失。
-
一、技术定位与核心优势JupyterLab 是下一代交互式计算开发环境,2025年发布的4.0版本新增以下特性:多语言内核支持:Python/R/Julia/JavaScript一键切换实时协作功能:类似Google Docs的多人协同编码AI辅助编程:集成GPT-5代码补全与错误诊断可视化调试器:支持变量追踪与执行流可视化二、跨平台安装方案1. 系统兼容性矩阵平台最低要求推荐环境Windows10 21H2WSL2 + Ubuntu 22.04macOSMonterey 12.3+M2芯片+16GB内存LinuxKernel 5.15+Docker容器化部署2. 前置依赖管理Python环境:建议使用pyenv管理多版本# 安装Python 3.12(当前LTS版本) pyenv install 3.12.4 pyenv global 3.12.4虚拟环境:创建独立沙盒避免依赖冲突python -m venv ~/.jupyterenv source ~/.jupyterenv/bin/activate三、安装流程详解(以Windows为例)步骤1:通过pip安装核心组件pip install jupyterlab==4.0.0 \ jupyterlab-lsp \ # 语言服务器协议支持 jupyterlab-git \ # 版本控制集成 jupyterlab-ai \ # AI辅助扩展 jupyterlab-vim \ # Vim键位绑定 jupyterlab-drawio # 流程图绘制工具步骤2:配置优化(修改~/.jupyter/jupyter_lab_config.py )c.ServerApp.root_dir = '/mnt/d/JupyterProjects' # 项目存储路径 c.LabApp.collaborative = True # 启用实时协作 c.AICodeCompletion.model = 'gpt-5-turbo' # 指定AI模型步骤3:启动服务并访问jupyter lab --port 8888 --no-browser 浏览器打开 http://localhost:8888 并输入token认证四、高阶功能配置1. GPU加速支持(需NVIDIA显卡)pip install cupy-cuda12x jupyterlab-cuda-dashboard nvidia-smi --jupyter-integration2. 数据库直连扩展安装PostgreSQL内核并配置连接池:# 在notebook中执行 !pip install jupyterlab-sql %load_ext sql %sql postgresql://user:password@localhost/mydb3. 三维可视化集成import ipyvolume as ipv ipv.quickvolshow(np.random.rand(128,128,128))五、典型应用场景案例1:机器学习全流程开发# 数据加载 -> 特征工程 -> 模型训练 -> 可视化评估 import polars as pl from sklearn.inspection import DecisionBoundaryDisplay df = pl.read_parquet("data.parquet") display(DecisionBoundaryDisplay.from_estimator(model, X, alpha=0.5))案例2:交互式地理数据分析import geemap Map = geemap.Map(center=(40, -100), zoom=4) Map.add_basemap('SATELLITE') Map六、故障排查指南Q1:内核启动失败检查虚拟环境激活状态重装ipykernel:pip install --force-reinstall ipykernelQ2:AI辅助无响应确认API密钥设置:jupyter lab --AIToken=sk-xxxx切换备用模型:c.AICodeCompletion.fallback_model = 'claude-3'Q3:扩展安装冲突使用conda/mamba解决依赖:mamba install -c conda-forge jupyterlab=4.0.0七、效能提升技巧快捷键自定义:通过Settings > Keyboard Shortcuts绑定常用操作主题优化:安装jupyterlab-material-night提升暗色模式体验预加载内核:在配置中启用c.KernelManager.autorestart = True八、延伸学习路径Jupyter官方文档声明:本教程使用JupyterLab 4.0版本制作,原创内容转载请注明来源。
-
大概多久可以出评分啊?
-
python运行速度要比cpp慢很多,会针对python单独开评分标准吗?还是说同样的算法用cpp来实现,就是要快些,分数就是要高些
-
本文将介绍如何使用 Python 连接数据库,并执行基本的操作,例如查询、插入、更新和删除数据。我们将以 MySQL 数据库为例,但原理同样适用于其他数据库,只需更换相应的驱动和连接信息即可。1. 安装数据库驱动首先,我们需要安装与数据库对应的 Python 驱动。对于 MySQL,我们可以使用 mysql-connector-python 或 PyMySQL。使用 pip 安装 mysql-connector-python:bash复制pip install mysql-connector-python或者安装 PyMySQL:bash复制pip install PyMySQL2. 连接数据库安装好驱动后,我们就可以使用 Python 连接数据库了。以下代码展示了如何使用 mysql-connector-python 连接 MySQL 数据库:python复制import mysql.connector# 数据库连接配置config = { 'user': 'root', # 数据库用户名 'password': 'password', # 数据库密码 'host': 'localhost', # 数据库主机地址 'database': 'testdb', # 数据库名称 'raise_on_warnings': True}# 建立数据库连接try: conn = mysql.connector.connect(**config) print("数据库连接成功!") # 创建游标对象 cursor = conn.cursor() # 执行SQL语句 cursor.execute("SELECT * FROM users") # 获取查询结果 results = cursor.fetchall() for row in results: print(row)except mysql.connector.Error as err: print(f"数据库连接失败: {err}")finally: # 关闭游标和连接 if 'conn' in locals() and conn.is_connected(): cursor.close() conn.close() print("数据库连接已关闭。")3. 执行 SQL 语句连接数据库后,我们可以使用游标对象执行各种 SQL 语句,例如:查询数据: 使用 SELECT 语句查询数据,并使用 fetchone()、fetchall() 或 fetchmany() 方法获取结果。插入数据: 使用 INSERT INTO 语句插入数据,并使用 commit() 方法提交更改。更新数据: 使用 UPDATE 语句更新数据,并使用 commit() 方法提交更改。删除数据: 使用 DELETE 语句删除数据,并使用 commit() 方法提交更改。以下代码展示了如何执行这些操作:python复制# 插入数据sql = "INSERT INTO users (name, email) VALUES (%s, %s)"values = ("John Doe", "john.doe@example.com")cursor.execute(sql, values)conn.commit()# 更新数据sql = "UPDATE users SET email = %s WHERE id = %s"values = ("new.email@example.com", 1)cursor.execute(sql, values)conn.commit()# 删除数据sql = "DELETE FROM users WHERE id = %s"values = (1,)cursor.execute(sql, values)conn.commit()4. 关闭连接完成数据库操作后,务必关闭游标和数据库连接,以释放资源。python复制cursor.close()conn.close()5. 使用 ORM 框架 (可选)对于更复杂的项目,建议使用 ORM (对象关系映射) 框架,例如 SQLAlchemy 或 Django ORM。ORM 框架可以将数据库表映射为 Python 对象,简化数据库操作,并提高代码的可读性和可维护性。总结本文介绍了如何使用 Python 连接数据库,并执行基本的操作。通过学习这些知识,你可以使用 Python 轻松地与数据库进行交互,开发各种数据库应用程序。
-
1.Docker应用部署(Mysql、tomcat、Redis、redis)https://bbs.huaweicloud.com/forum/thread-0251176000289103057-1-1.html 2. 鸿蒙NEXT开发案例:随机数生成https://bbs.huaweicloud.com/forum/thread-0226175856046738051-1-1.html3.ExaGear for Server on Ubuntuhttps://bbs.huaweicloud.com/forum/thread-02127175583262901024-1-1.html4.惊叹数据结构之美,品味排序算法之妙:对快排的详细介绍 -转载https://bbs.huaweicloud.com/forum/thread-0210175572143077031-1-1.html5.修改 Docker 容器的 http_proxy 和 https_proxy -转载https://bbs.huaweicloud.com/forum/thread-02127175572007355023-1-1.html6.【Linux】gdb_进程概念-转载https://bbs.huaweicloud.com/forum/thread-0257175571963347026-1-1.html7.详解Redis之事务-转载https://bbs.huaweicloud.com/forum/thread-0251175571892832022-1-1.html8.Python中的对象关系映射SQLAlchemy ORM在Web开发中的实践 -转载https://bbs.huaweicloud.com/forum/thread-0218175571849778026-1-1.html9.鸿蒙NEXT开发案例:颜文字搜索器https://bbs.huaweicloud.com/forum/thread-0225175848016900053-1-1.html10.鸿蒙NEXT开发案例:经纬度距离计算https://bbs.huaweicloud.com/forum/thread-02127175847897096052-1-1.html11.鸿蒙NEXT开发案例:世界时间表https://bbs.huaweicloud.com/forum/thread-0220175848120824046-1-1.html12.鸿蒙NEXT开发案例:保质期计算https://bbs.huaweicloud.com/forum/thread-0257175848211239048-1-1.html13.鸿蒙NEXT开发案例:九宫格随机https://bbs.huaweicloud.com/forum/thread-0257175848540835049-1-1.html14.Python中的对象关系映射SQLAlchemy ORM在Web开发中的实践 -转载https://bbs.huaweicloud.com/forum/thread-0218175571849778026-1-1.html15.【MySQL】 表的操作-转载https://bbs.huaweicloud.com/forum/thread-0220174982575490008-1-1.html
-
25年的第二次合集来了,涵盖多方面内容,供大家阅读。1.解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题https://bbs.huaweicloud.com/forum/thread-0226176114797408069-1-1.html2.C 与 C++ 中的 const 常量与数组大小的关系对比分析【转】https://bbs.huaweicloud.com/forum/thread-0225176114407160080-1-1.html3. Java对象和JSON字符串之间的转换方法(全网最清晰)【转】https://bbs.huaweicloud.com/forum/thread-0218176114284451074-1-1.html4.Python中利用json库进行JSON数据处理详解【转】https://bbs.huaweicloud.com/forum/thread-0225176114218197079-1-1.html5.Python使用sys.path查看当前的模块搜索路径【转】https://bbs.huaweicloud.com/forum/thread-0225176047116377070-1-1.html6.PyTorch环境中CUDA版本冲突问题排查与解决方案【转】https://bbs.huaweicloud.com/forum/thread-0225176047065418069-1-1.html7.python 3.8 的anaconda下载方法【转】https://bbs.huaweicloud.com/forum/thread-02127176045871929063-1-1.html8.Python实现批量Excel拆分功能【转】https://bbs.huaweicloud.com/forum/thread-0218176045720424067-1-1.html9.Python中常用的四种取整方式分享【转】https://bbs.huaweicloud.com/forum/thread-0218176037491495065-1-1.html10.Python自动化处理手机验证码【转】https://bbs.huaweicloud.com/forum/thread-0210176037394123079-1-1.html11. Docker应用部署(Mysql、tomcat、Redis、redis)https://bbs.huaweicloud.com/forum/thread-0251176000289103057-1-1.html12.使用Python实现文件重命名的三种方法【转】https://bbs.huaweicloud.com/forum/thread-0210175967963879073-1-1.html13.python安装whl包并解决依赖关系的实现【转】https://bbs.huaweicloud.com/forum/thread-0226175967884244062-1-1.html14.Python轻松实现批量邮件自动化详解【转】https://bbs.huaweicloud.com/forum/thread-0251175967723301055-1-1.html15.Python脚本实现图片文件批量命名【转】https://bbs.huaweicloud.com/forum/thread-0226175967493359061-1-1.html16.Python中多线程和多进程的基本用法详解【转】https://bbs.huaweicloud.com/forum/thread-0251175967381425054-1-1.html17.鸿蒙NEXT开发案例:随机数生成https://bbs.huaweicloud.com/forum/thread-0226175856046738051-1-1.html18.鸿蒙NEXT开发案例:简体繁体转换器https://bbs.huaweicloud.com/forum/thread-0251175855906014051-1-1.html19.鸿蒙NEXT开发案例:血型遗传计算https://bbs.huaweicloud.com/forum/thread-0220175855724260049-1-1.html20.鸿蒙NEXT开发案例:数字转中文大小写https://bbs.huaweicloud.com/forum/thread-0225175850374977055-1-1.html
-
Python的json库用于处理JSON(JavaScript Object Notation)数据格式。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python的json库提供了函数来编码(将Python对象转换为JSON字符串)和解码(将JSON 字符串转换为Python对象)JSON数据。编码Python对象为JSON字符串使用json.dumps()方法将Python对象编码为JSON字符串:12345678910111213141516import json data = { "name": "Morris", "age": 18, "mail": "Morris@18.com"} # dict -> jsonstr = json.dumps(data, indent=4)print(str) arr = [data, data]# list -> jsonarr_str = json.dumps(arr, indent=4)print(arr_str)运行结果如下:{ "name": "Morris", "age": 18, "mail": "Morris@18.com"}[ { "name": "Morris", "age": 18, "mail": "Morris@18.com" }, { "name": "Morris", "age": 18, "mail": "Morris@18.com" }]indent参数用于美化输出,使JSON字符串更具可读性。解码JSON字符串为Python对象使用json.loads()方法将JSON字符串解码为Python对象(通常是字典或列表):1234567891011121314151617181920212223242526272829import json object_str = """{ "name": "Morris", "age": 18, "mail": "Morris@18.com"}""" obj = json.loads(object_str)print(obj) array_str = """[ { "name": "Morris", "age": 18, "mail": "Morris@18.com" }, { "name": "Morris", "age": 18, "mail": "Morris@18.com" }]"""arr = json.loads(array_str)print(arr)运行结果如下:{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}[{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}, {'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}]将Python对象写入JSON文件json.dump()函数也是用于将Python对象编码成JSON格式,但它直接将编码后的数据写入到一个文件中,而不是返回字符串。1234567891011import json data = { "name": "Morris", "age": 18, "mail": "Morris@18.com"} # dict -> json filewith open('data.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) 从文件中读取JSON数据使用json.load()方法从文件中读取JSON数据并将其解析为Python对象:123456import json # json file -> dictwith open('data.json', 'r', encoding='utf-8') as f: obj = json.load(f) print(obj)运行结果如下:{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}处理复杂对象有时你可能需要处理包含复杂对象(如自定义类实例)的JSON数据。你可以通过实现自定义的编码器和解码器来处理这些对象。自定义编码器要实现自定义编码器,你需要创建一个继承自json.JSONEncoder的类,并重写default方法:123456789101112131415161718import jsonfrom datetime import datetime class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime("%Y-%m-%d %H:%M:%S") # 其他自定义处理 return json.JSONEncoder.default(self, obj) data = { "name": "Morris", "timestamp": datetime.now()} json_str = CustomEncoder().encode(data)print(json_str)运行结果如下:{"name": "Morris", "timestamp": "2024-12-31 14:16:55"}自定义解码器要实现自定义解码器,你需要创建一个继承自json.JSONDecoder的类,并重写object_hook或object_pairs_hook方法:1234567891011121314151617181920212223242526import jsonfrom datetime import datetime def datetime_parser(dct): for key, value in dct.items(): if isinstance(value, str): try: # 假设日期格式是 "YYYY-MM-DD" dct[key] = datetime.strptime(value, "%Y-%m-%d %H:%M:%S") except ValueError: # 如果不是日期格式,则保持原样 pass return dct json_str = """{ "name": "Morris", "timestamp": "2024-12-31 14:16:55"}""" data = json.loads(json_str, object_hook=datetime_parser)print(data)print(data['timestamp']) 运行结果如下:{'name': 'Morris', 'timestamp': datetime.datetime(2024, 12, 31, 14, 16, 55)}2024-12-31 14:16:55
-
功能讲解以下是关于 sys.path 的详细解释:用途:sys.path 决定了 Python 解释器在导入模块时的搜索顺序。它可以帮助你组织代码,确保模块可以被正确导入。组成:sys.path 通常由以下几部分组成:当前脚本所在的目录。PYTHONPATH(环境变量)设置的目录。安装 Python 时默认的库路径(例如:lib/pythonX.X/site-packages)。查看 sys.path:你可以在 Python 解释器中通过以下代码查看 sys.path 的内容:12import sysprint(sys.path)修改 sys.path:你可以修改 sys.path 来添加或删除搜索路径,例如:12import syssys.path.append('/path/to/your/module')注意:修改 sys.path 应该谨慎操作,因为这可能会影响到模块的导入。注意事项:当你在导入模块时遇到“ModuleNotFoundError”,很可能是因为模块所在的路径不在 sys.path 中。在某些情况下,为了防止路径问题,建议使用绝对导入而不是相对导入。示例:假设你有以下文件结构:1234project/├── main.py└── my_module/ └── my_module.py在 main.py 中,你想导入 my_module.py。如果 project/ 不在 sys.path 中,你会遇到导入错误。在这种情况下,你可以修改 main.py:123import syssys.path.append('/path/to/project')import my_module.my_module总之,理解 sys.path 对于模块导入和 Python 项目组织非常重要。正确配置 sys.path 可以帮助你更有效地管理代码和依赖。操作示例下面是如何查看和操作sys.path的步骤:查看sys.path首先,你需要导入Python的sys模块,因为sys.path是sys模块的一部分。然后,你可以通过打印sys.path来查看当前的模块搜索路径。下面是一个简单的例子:123import sys# 打印当前的模块搜索路径print(sys.path)运行这段代码后,你会看到输出当前的sys.path列表,其中包含了Python解释器查找模块的目录。修改sys.path如果你想要添加或修改模块的搜索路径,可以直接修改sys.path列表。例如,添加一个新的目录到搜索路径:1234567import sys# 添加一个新的目录到搜索路径new_directory = '/path/to/your/module'if new_directory not in sys.path: sys.path.append(new_directory)# 再次打印查看修改后的路径print(sys.path)注意事项修改sys.path会影响到当前Python进程中的所有模块查找操作,因此需要谨慎进行。添加的目录必须是有效的Python模块目录(即包含有__init__.py文件的目录,或者在Python 3.3及以上版本中,可以是包含有__init__.pyi文件的目录)。在使用第三方库或模块时,确保它们的安装位置被包含在sys.path中,否则Python解释器将无法找到并导入这些模块。通过上述方法,你可以方便地查看和修改Python的模块搜索路径。
-
引言在使用 PyTorch 进行深度学习开发时,CUDA 版本兼容性问题是个老生常谈的话题。本文将通过一次真实的排查过程,剖析 PyTorch 虚拟环境自带 CUDA 运行时库与系统全局 CUDA 环境冲突的场景,并一步步分析问题、定位原因,并最终给出解决方案。问题复现:ImportError: undefined symbol始于一个看似简单的 import torch 语句(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ pythonPython 3.12.9 (main, Feb 12 2025, 14:50:50) [Clang 19.1.6 ] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import torch>>> Traceback (most recent call last):>>> File "<stdin>", line 1, in <module>>>> File "/home/wangh/codes/ModelForger/.venv/lib/python3.12/site-packages/torch/__init__.py", line 367, in <module>>>> from torch._C import * # noqa: F403>>> ^^^^^^^^^^^^^^^^^^^^^^>>> ImportError: /home/wangh/codes/ModelForger/.venv/lib/python3.12/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12错误信息很明确,在 libcusparse.so.12 中找不到符号 __nvJitLinkComplete_12_4,这通常意味着存在版本不匹配的问题。 初步排查:环境 & CUDA 版本首先,我们检查一下环境和 CUDA 版本(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ echo $LD_LIBRARY_PATH/usr/local/cuda/lib64:(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ nvcc --versionnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2023 NVIDIA CorporationBuilt on Wed_Nov_22_10:17:15_PST_2023Cuda compilation tools, release 12.3, V12.3.107Build cuda_12.3.r12.3/compiler.33567101_0(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ uv pip list | grep nvidiaUsing Python 3.12.9 environment at: /home/wangh/codes/ModelForger/.venvnvidia-cublas-cu12 12.4.5.8nvidia-cuda-cupti-cu12 12.4.127nvidia-cuda-nvrtc-cu12 12.4.127nvidia-cuda-runtime-cu12 12.4.127nvidia-cudnn-cu12 9.1.0.70nvidia-cufft-cu12 11.2.1.3nvidia-curand-cu12 10.3.5.147nvidia-cusolver-cu12 11.6.1.9nvidia-cusparse-cu12 12.3.1.170nvidia-nccl-cu12 2.21.5nvidia-nvjitlink-cu12 12.4.127nvidia-nvtx-cu12 12.4.127发现了两个关键信息nvcc --version 系统安装的 CUDA 版本是 12.3。nvidia-* 虚拟环境安装的 nvjitlink 版本号为 12.4.127。根据错误信息可知,PyTorch 虚拟环境中的动态库 libcusparse.so.12 需要的正是 libnvJitLink.so.12 的 __nvJitLinkComplete_12_4 版本,pip 安装的依赖包版本自身没有问题,因此推测可能错误链接到了系统中 CUDA 12.3 的 libnvJitLink.so.12。 分析:动态链接库加载路径为了验证猜想,我们使用 patchelf 和 ldd 命令查看 libcusparse.so.12 的动态链接状态:(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ patchelf --print-rpath libcusparse.so.12$ORIGIN:$ORIGIN/../../nvjitlink/lib(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ ldd libcusparse.so.12 linux-vdso.so.1 (0x00007ffc507e2000) libnvJitLink.so.12 => /usr/local/cuda/lib64/libnvJitLink.so.12 (0x00007f867a399000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f867a353000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f867a349000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f867a343000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f867a1f4000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f867a1d7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8679fe5000) /lib64/ld-linux-x86-64.so.2 (0x00007f868e62d000)果不其然 libcusparse.so.12 依赖的 libnvJitLink.so.12 被加载到了系统 CUDA 目录 (/usr/local/cuda/lib64) 下,而不是预定义的 PyTorch 虚拟环境的目录。问题根源:LD_LIBRARY_PATH 优先级(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ echo $LD_LIBRARY_PATH/usr/local/cuda/lib64:至此,问题根源已经明确:LD_LIBRARY_PATH 环境变量导致系统 CUDA 库路径优先于 PyTorch 虚拟环境的 CUDA 库路径被加载。这导致了版本不匹配,PyTorch 无法找到所需的符号。 解决方案:unset LD_LIBRARY_PATH解决这个问题最直接的方法就是移除 LD_LIBRARY_PATH 对系统 CUDA 路径的设置:(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ unset LD_LIBRARY_PATH再次查看 libcusparse.so.12 的动态链接:(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ ldd libcusparse.so.12 linux-vdso.so.1 (0x00007fff959a7000) libnvJitLink.so.12 => /home/wangh/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib/./../../nvjitlink/lib/libnvJitLink.so.12 (0x00007f303000e000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f302ffc8000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f302ffbe000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f302ffb8000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f302fe69000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f302fe4c000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f302fc5a000) /lib64/ld-linux-x86-64.so.2 (0x00007f30443f9000)现在,libnvJitLink.so.12 正确地加载到了 PyTorch 虚拟环境的目录下。验证:问题解决现在,libnvJitLink.so.12 正确地加载到了 PyTorch 虚拟环境的目录下。验证:问题解决最佳实践与总结避免全局设置 LD_LIBRARY_PATH: 在全局环境变量(如 .bashrc 或 .bash_profile)中设置 LD_LIBRARY_PATH 会干扰虚拟环境的独立性。理解动态链接机制: 了解 LD_LIBRARY_PATH 的作用以及动态链接库的加载顺序,有助于快速定位和解决类似问题。
-
Python3.8 版本的 Anaconda 下载与安装指南在当今数据科学、机器学习和人工智能领域,Anaconda 作为一款集成了众多 Python 包的发行版,受到了广泛欢迎。它不仅简化了环境管理,还极大地提高了开发效率。本文将详细介绍如何下载并安装包含 Python 3.8 的 Anaconda 发行版,帮助读者快速上手使用这一强大的工具。一、Anaconda 简介Anaconda 是由 Continuum Analytics 公司开发的一个开源项目,是一个用于科学计算的数据分析包集合,包括了许多流行的科学计算包如 NumPy, SciPy, pandas, IPython, matplotlib, scikit-learn 等。同时,Anaconda 提供了一个名为 conda 的包管理器以及环境管理系统,使得用户可以非常方便地安装这些包,并且可以轻松创建不同的环境来隔离不同项目之间的依赖关系。二、下载 Anaconda打开浏览器 并访问 Anaconda 官方网站在首页上找到 “Download Anaconda” 部分,点击进入下载页面。选择合适的版本进行下载:对于大多数个人用户而言,Anaconda Individual Edition 即可满足需求;根据操作系统(Windows/Mac/Linux)选择对应的安装程序;在版本选择方面,由于我们的目标是安装 Python 3.8,请务必确认所选安装包支持该版本。注意:Anaconda 官网提供的最新版可能已经更新到了更高版本的 Python。如果直接下载最新版但没有明确指定 Python 3.8,则可能会自动安装较新的 Python 版本。因此,在下载前最好先检查一下安装包的具体信息,或者直接通过 Anaconda Navigator 手动设置 Python 版本。三、安装 AnacondaWindows 系统下载完成后运行 .exe 文件,开始安装向导。一路点击 “Next” 直到看到 “Advanced Options” 页面,在这里可以根据需要选择是否添加 Anaconda 到 PATH 环境变量,建议勾选以方便后续操作。在 “Install for” 选项中选择 “Just Me” 或 “All Users”,前者只对当前账户生效,后者则对所有系统账户都可用。继续点击 “Next” 直至完成安装。macOS 系统双击下载好的 .pkg 文件,启动安装助手。按照提示完成安装步骤,过程中同样可以选择是否更新系统路径。Linux 系统打开终端,切换到下载目录,执行以下命令:1bash Anaconda3-2021.11-Linux-x86_64.sh按照脚本提示完成安装过程。为使 Anaconda 生效,需要更新 .bashrc 或者 .zshrc 文件(取决于使用的 shell),添加如下内容:1export PATH="/home/yourname/anaconda3/bin:$PATH"最后,重新加载配置文件或重启终端即可。四、验证安装结果无论在哪种操作系统上完成安装后,都可以通过终端(或命令行)输入 conda --version 和 python --version 来验证是否成功安装 Anaconda 及其携带的 Python 版本。五、设置 Python 3.8 作为默认版本假设已经按照上述方法正确安装了 Anaconda,但默认安装的 Python 版本并不是我们想要的 3.8,此时可以通过以下步骤来调整:使用 conda env list 查看所有已创建的环境。如果没有 Python 3.8 的环境,可以创建一个新的环境:1conda create -n py38 python=3.8激活刚刚创建的环境:1conda activate py38检查当前激活环境中 Python 的版本:1python --version输出结果应为 Python 3.8.x。为了以后能够更加方便地切换环境,可以考虑利用别名功能。例如,在 .bashrc 或者 .zshrc 中添加一行命令:1alias py38="conda activate py38"这样每当我们想要使用 Python 3.8 时只需输入 py38 就能快速切换到相应的环境。
-
在日常办公中,我们经常需要将包含多个Sheet页的Excel文件拆分成多个独立的Excel文件。例如,当我们要把一份Excel表格发给各部门确认时,出于控制信息知悉范围、确保数据保密性等方面的考虑,每个部门仅需查看和确认与自己部门对应的Sheet页。手动拆分Excel文件非常繁琐耗时,为了提高效率,我们可以使用Python编写一个自动化小工具,批量拆分Excel文件中的每个Sheet页为独立的Excel文件。本文将分享如何使用Python实现批量Excel拆分的功能,并提供详细的代码解释。1. 需求分析保持原始Sheet页格式: 在拆分过程中,需要保证每个独立Excel文件中的内容格式与原Excel文件中对应Sheet页的格式完全一致,包括字体样式、单元格格式、颜色设置、对齐方式等,避免因格式丢失影响数据的查看和分析。输出文件管理: 将拆分后的独立Excel文件统一存放到指定的输出文件夹中,便于管理和查找。2. 安装依赖库在开始编写代码之前,我们需要安装一些必要的 Python 库。这里我们将使用 pywin32 库来操作Excel文件,使用 tqdm 库来显示拆分进度。你可以通过以下命令进行安装:1pip install pywin32 tqdm 3. 代码实现以下是完整的Python代码,用于批量拆分Excel文件中的每个Sheet页为独立的Excel文件。代码中包含了详细的中文注释,方便大家理解。3.1 sheet2excel.pyimport osimport shutilimport win32com.clientfrom tqdm import tqdmdef sheet2excel(input_excel_path, output_path): """ 将Excel文件中的每个Sheet页拆分为独立的Excel文件 :param input_excel_path: 输入的Excel文件路径 :param output_path: 输出的文件夹路径 """ # 获取当前脚本所在的目录 parent = os.path.dirname(os.path.realpath(__file__)) # 初始化Excel应用程序 excel = win32com.client.Dispatch("Excel.Application") excel.Visible = False # 不显示Excel界面 # 输出文件夹存在则删除重新创建 output_dir_path = os.path.join(parent, output_path) if os.path.exists(output_dir_path): shutil.rmtree(output_dir_path) os.makedirs(output_dir_path) try: # 打开Excel文件 wb = excel.Workbooks.Open(os.path.join(parent, input_excel_path)) # 遍历每个Sheet页 for sheet in tqdm(wb.Sheets, desc="EXCEL拆分"): # 复制当前Sheet页到一个新的工作簿 sheet.Copy() # 保存新的工作簿为独立的Excel文件 excel.ActiveWorkbook.SaveAs(os.path.join(output_dir_path, f"{sheet.Name}.xlsx")) # 关闭新的工作簿 excel.ActiveWorkbook.Close() # 关闭原始工作簿 wb.Close() finally: # 退出Excel应用程序 excel.Quit()if __name__ == "__main__": # 示例:拆分当前目录下的example.xlsx文件,输出到output文件夹 sheet2excel("example.xlsx", "output")3.2 代码说明1. 函数定义与路径处理:sheet2excel 函数接收两个参数:input_excel_path(输入的 Excel 文件路径)和 output_path(输出的文件夹路径)。通过 os.path.dirname(os.path.realpath(__file__)) 获取当前脚本所在的目录,再使用 os.path.join 函数将相对路径转换为绝对路径,确保在不同操作系统上都能正确处理文件和文件夹路径。2. Excel 应用程序初始化:win32com.client.Dispatch("Excel.Application"):初始化 Excel 应用程序对象,用于后续对 Excel 文件的操作。excel.Visible = False:将 Excel 应用程序设置为不可见,避免在后台打开 Excel 界面,减少对用户操作的干扰。3. 输出文件夹处理:shutil.rmtree(output_dir_path):若输出文件夹已经存在,则删除该文件夹及其包含的所有内容,确保输出文件夹为空,避免文件冲突。os.makedirs(output_dir_path):创建新的输出文件夹,用于存放拆分后的独立 Excel 文件。4. 文件拆分操作:wb = excel.Workbooks.Open(...):打开指定的 Excel 文件。for sheet in tqdm(wb.Sheets, desc="EXCEL 拆分"):使用 tqdm 库遍历 Excel 文件中的每个 Sheet 页,并显示拆分进度。sheet.Copy():将当前 Sheet 页复制到一个新的工作簿中。excel.ActiveWorkbook.SaveAs(...):将新的工作簿保存为独立的 Excel 文件,文件名以原 Sheet 页的名称命名。excel.ActiveWorkbook.Close():关闭新的工作簿。wb.Close():关闭原始的 Excel 工作簿。5. 资源释放:excel.Quit():退出 Excel 应用程序,释放相关资源。4. 运行示例假设我们有一个名为example.xlsx的Excel文件,其中包含三个Sheet页:Sheet1、Sheet2和Sheet3。我们可以通过以下代码将每个Sheet页拆分为独立的Excel文件,并保存到output文件夹中:12if __name__ == "__main__": sheet2excel("example.xlsx", "output")运行上述代码后,output文件夹中将生成三个独立的Excel文件:Sheet1.xlsx、Sheet2.xlsx和Sheet3.xlsx。在拆分过程中,你可以在控制台看到拆分进度的显示,方便了解拆分工作的进展情况。5. 注意事项Excel 版本兼容性:此代码基于 pywin32 库操作Excel文件,需要确保你的系统中安装了Microsoft Excel软件,并且代码在不同版本的 Excel上可能存在兼容性问题。建议在运行代码前,先在小范围数据上进行测试。输出文件夹权限:确保运行代码的用户对输出文件夹具有读写和删除权限,否则可能会导致无法正常创建或删除输出文件夹。数据备份:在执行拆分操作前,务必对原始Excel文件进行备份,以防在拆分过程中出现意外情况导致数据丢失或损坏。6. 总结通过本文介绍的Python代码,我们可以轻松实现批量拆分Excel文件的功能。这种方法不仅提高了工作效率,还减少了手动操作带来的错误风险。
-
引言在数据处理和数值计算中,取整操作是非常常见的需求。Python 提供了多种取整方式,涵盖了向零取整、向下取整、向上取整和四舍五入等场景。不同的取整方式适用于不同的需求,例如对范围的限制、舍入精度控制等。本文将详细介绍 Python 中这四种取整方式的实现方法及其使用示例,帮助大家在实际开发中选择合适的取整策略,提升代码的精确性向零取整(Truncate)向零取整是指将小数部分截掉,结果总是趋向于零。Python 中的 int() 函数和 math.trunc() 函数都可以实现这一操作。示例代码:import math# 正数向零取整print(int(3.9)) # 输出: 3print(math.trunc(3.9)) # 输出: 3# 负数向零取整print(int(-3.9)) # 输出: -3print(math.trunc(-3.9)) # 输出: -3int() 和 math.trunc() 的区别在于:int() 同时可以将字符串类型的整数转换为整数类型,而 math.trunc() 仅用于截断小数部分。向下取整(Floor)向下取整,也称为地板取整,意味着将数值向下舍入到小于等于该值的最大整数。Python 提供了 math.floor() 函数来实现这一操作。示例代码:import math# 正数向下取整print(math.floor(3.9)) # 输出: 3# 负数向下取整print(math.floor(-3.9)) # 输出: -4向下取整对于负数结果更小,通常用于对连续范围进行离散化,或在特定情况下生成不大于指定值的整数。向上取整(Ceil)向上取整也称为天花板取整,它将数值向上舍入到大于等于该值的最小整数。可以使用 math.ceil() 函数来完成。示例代码:import math# 正数向上取整print(math.ceil(3.1)) # 输出: 4# 负数向上取整print(math.ceil(-3.1)) # 输出: -3该方法用于确保不小于指定数值的离散整数,通常在需要向上保留的场景中使用。四舍五入(Round)四舍五入是最常见的取整方式,在 Python 中,round() 函数提供了这种功能。四舍五入将小数部分大于等于 0.5 的值向上舍入,小于 0.5 的值向下舍入。示例代码:# 四舍五入print(round(3.5)) # 输出: 4print(round(3.4)) # 输出: 3# 负数四舍五入print(round(-3.5)) # 输出: -4print(round(-3.4)) # 输出: -3round() 函数在四舍五入到指定的小数位数时也很有用,比如 round(3.456, 2) 会将数值保留两位小数并输出 3.46。四种取整方式的对比取整方式Python 实现特点向零取整int()、math.trunc()截断小数部分,向零方向取整向下取整math.floor()向负无穷取整,负数更小向上取整math.ceil()向正无穷取整,正数更大四舍五入round()基于四舍五入规则调整整数
-
手机验证码(SMS Verification Code) 是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景。自动化处理手机验证码在数据抓取、自动化测试、批量注册等应用中具有重要意义。然而,需要注意的是,未经授权的自动化获取和使用验证码可能违反相关法律法规和网站的使用条款。因此,在进行相关操作时,请确保遵守法律法规,并获得必要的授权。本文将详细介绍如何使用Python自动化处理手机验证码,包括以下内容:获取手机验证码解析和提取验证码自动化输入验证码实际应用中的注意事项一、获取手机验证码1.1 通过短信接收验证码最常见的获取方式是通过短信接收验证码。自动化处理的关键在于如何自动读取短信内容。1.2 使用第三方短信接收服务一些第三方服务(如Twilio、Nexmo等)提供API接口,可以接收和读取短信内容。这些服务通常需要注册账号并获取API密钥。示例:使用Twilio接收短信from twilio.rest import Client# Twilio账户信息account_sid = 'YOUR_ACCOUNT_SID'auth_token = 'YOUR_AUTH_TOKEN'client = Client(account_sid, auth_token)# 获取最新的一条短信message = client.messages.list(limit=1)[0]print(f"验证码: {message.body}")# 提取验证码(假设验证码是 6 位数字)import reverification_code = re.search(r'\b\d{6}\b', latest_message).group()print(f"提取的验证码: {verification_code}")1.3 使用ADB读取手机短信通过Android Debug Bridge(ADB)可以读取连接设备上的短信内容。步骤:连接手机并启用USB调试。安装ADB工具并配置环境变量。使用ADB命令读取短信。示例代码:import subprocessimport redef get_sms_verification_code(): # 使用ADB命令读取短信 result = subprocess.run(['adb', 'shell', 'content', 'query', '--uri', 'content://sms/inbox'], capture_output=True, text=True) messages = result.stdout.splitlines() # 正则表达式匹配验证码(假设验证码为4-6位数字) pattern = re.compile(r'验证码[::]\s*(\d{4,6})') for message in messages: match = pattern.search(message) if match: return match.group(1) return Nonecode = get_sms_verification_code()if code: print(f"获取到的验证码: [code]")else: print("未找到验证码")1.4 通过API获取验证码某些应用或网站提供API接口,可以直接获取验证码。这种方式通常需要开发者权限或特定的访问密钥。示例:import requestsdef get_verification_code(api_url, api_key): headers = { 'Authorization': f'Bearer {api_key}' } response = requests.get(api_url, headers=headers) if response.status_code == 200: data = response.json() return data.get('code') else: print(f"获取验证码失败: {response.status_code}") return Noneapi_url = 'https://api.example.com/get_code'api_key = 'YOUR_API_KEY'code = get_verification_code(api_url, api_key)if code: print(f"获取到的验证码: [code]")1.5 通过邮件接收验证码使用 IMAP 协议读取邮件1、安装 imaplib 和 email 库(Python 自带)。2、使用以下代码读取邮件并提取验证码:import imaplibimport emailimport re# 邮箱配置email_user = 'your_email@example.com'email_pass = 'your_email_password'imap_server = 'imap.example.com'# 连接到邮箱mail = imaplib.IMAP4_SSL(imap_server)mail.login(email_user, email_pass)mail.select('inbox')# 搜索最新邮件status, messages = mail.search(None, 'ALL')latest_email_id = messages[0].split()[-1]# 获取邮件内容status, msg_data = mail.fetch(latest_email_id, '(RFC822)')raw_email = msg_data[0][1]msg = email.message_from_bytes(raw_email)# 提取邮件正文if msg.is_multipart(): for part in msg.walk(): content_type = part.get_content_type() if content_type == 'text/plain': body = part.get_payload(decode=True).decode() breakelse: body = msg.get_payload(decode=True).decode()# 提取验证码(假设验证码是 6 位数字)verification_code = re.search(r'\b\d{6}\b', body).group()print(f"提取的验证码: {verification_code}")二、解析和提取验证码在获取到验证码后,通常需要对其进行解析和提取。这一步骤取决于验证码的格式和传输方式。2.1 正则表达式提取使用正则表达式从短信或其他文本中提取验证码。import redef extract_code(text): pattern = re.compile(r'验证码[::]\s*(\d{4,6})') match = pattern.search(text) if match: return match.group(1) return Nonetext = "您的验证码是:123456,请在5分钟内使用。"code = extract_code(text)print(f"提取到的验证码: [code]")2.2 JSON解析如果验证码通过API以JSON格式返回,可以使用json模块解析。import jsondef parse_json_code(json_data): data = json.loads(json_data) return data.get('code')json_data = '{"code": "654321", "expiry": 300}'code = parse_json_code(json_data)print(f"解析到的验证码: [code]")三、自动化输入验证码获取并提取验证码后,可以将其自动输入到目标应用或网站中。这通常涉及模拟用户操作,如填写表单、点击按钮等。3.1 使用Selenium自动化Web应用示例:自动登录并输入验证码from selenium import webdriverimport time# 初始化浏览器驱动driver = webdriver.Chrome(executable_path='path/to/chromedriver')# 打开登录页面driver.get('https://example.com/login')# 输入用户名和密码driver.find_element_by_id('username').send_keys('your_username')driver.find_element_by_id('password').send_keys('your_password')# 获取验证码并输入code = get_sms_verification_code() # 使用前述方法获取验证码driver.find_element_by_id('verification_code').send_keys(code)# 提交表单driver.find_element_by_id('login_button').click()# 等待登录完成time.sleep(5)# 关闭浏览器driver.quit()3.2 使用Appium自动化移动应用示例:自动填写移动应用中的验证码from appium import webdriverimport timedesired_caps = { 'platformName': 'Android', 'deviceName': 'YourDeviceName', 'appPackage': 'com.example.app', 'appActivity': '.MainActivity',}driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 等待应用加载time.sleep(5)# 输入验证码code = get_sms_verification_code()driver.find_element_by_id('com.example.app:id/verification_code').send_keys(code)# 提交验证码driver.find_element_by_id('com.example.app:id/submit_button').click()# 等待操作完成time.sleep(5)driver.quit()
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签