避坑指南:PM2运行Python脚本时你一定会遇到的5个问题(附解决方案)

# 避坑指南:PM2运行Python脚本时你一定会遇到的5个问题(附解决方案) 作为一名从Node.js生态“跨界”到Python项目管理的开发者,我最初对PM2的期待很简单:一个能守护我的Python脚本、自动重启、方便查看日志的进程管理工具。然而,现实很快给了我几记闷棍——脚本莫名僵死、日志目录一片空白、虚拟环境里的包统统失效……这些坑,几乎每一个初次将PM2与Python结合的朋友都会踩到。网上零散的教程往往只告诉你`pm2 start app.py --interpreter python`这条命令,却对背后潜藏的“暗礁”语焉不详。今天,我们就来一次彻底的排雷行动,聚焦五个最高频、最恼人的实际问题。我会带你从具体的错误现象出发,剖析其根本原因,并给出可直接复制粘贴的修复命令和配置方案。这不仅仅是一份解决方案列表,更是一次对PM2运行Python机制的理解之旅,让你从“能用”进阶到“懂用”。 ## 1. 问题一:解释器路径错误——“Command failed” 这是最经典的“开门杀”。你信心满满地执行了`pm2 start your_script.py`,终端却返回一个冰冷的错误。 **问题现象** 在PM2的日志中(通过`pm2 logs`查看),你大概率会看到类似这样的报错信息: ``` Error: Command failed: /usr/bin/python3 /path/to/your_script.py /bin/sh: 1: /usr/bin/python3: not found ``` 或者,更直接地,进程状态显示为`errored`或`stopped`,根本启动不起来。 **原因分析** PM2默认会尝试使用系统环境变量中的`python`命令来执行你的脚本。但是,这里有几个关键点容易被忽略: 1. **系统默认Python路径**:在许多Linux发行版中,`python`命令可能指向Python 2.x,而你的脚本很可能是为Python 3.x编写的。直接使用`python`会导致语法错误。 2. **虚拟环境未被激活**:即使你系统安装的是Python 3,如果你在开发时使用了虚拟环境(venv, conda等),那么所有第三方包都安装在虚拟环境的目录里。PM2直接调用系统Python解释器时,根本找不到这些依赖。 3. **PM2的`--interpreter`参数使用不当**:很多人知道用`--interpreter python3`,但这依然假设了`python3`命令在系统的PATH中,且版本符合要求。 问题的核心在于,**PM2进程管理器本身运行在一个独立的环境中,它不会自动激活你终端里手动`source activate`的那个虚拟环境**。 **解决命令与配置** 解决方案的核心是**明确、绝对地指定Python解释器的完整路径**。 * **方案A:直接指定绝对路径(最直接)** 找到你的Python解释器的绝对路径。如果你使用虚拟环境,路径通常在项目目录下的`venv/bin/python`或类似位置。 ```bash # 假设你的虚拟环境在项目根目录的 .venv 文件夹下 pm2 start your_script.py --name my-python-app --interpreter /absolute/path/to/your/project/.venv/bin/python ``` 你可以通过`which python`或`which python3`在激活的虚拟环境中查看具体路径。 * **方案B:使用生态系统配置文件(推荐,便于管理)** 对于复杂的应用,创建一个`ecosystem.config.js`文件是更专业的选择。它能让你的配置版本化、参数更清晰。 ```javascript // ecosystem.config.js module.exports = { apps: [{ name: 'my-python-app', script: './your_script.py', interpreter: '/absolute/path/to/your/project/.venv/bin/python', // 关键在这里! args: '--arg1 value1', // 如果需要传递命令行参数 instances: 1, autorestart: true, watch: false, max_memory_restart: '1G', env: { NODE_ENV: 'production', PYTHONPATH: '/absolute/path/to/your/project' // 有时需要设置Python路径 }, error_file: './logs/err.log', out_file: './logs/out.log', log_date_format: 'YYYY-MM-DD HH:mm:ss' }] }; ``` 然后使用`pm2 start ecosystem.config.js`启动。这个文件里,`interpreter`的配置一目了然,一劳永逸。 > 注意:在Docker容器或某些严格的环境中,即使指定了绝对路径也可能因动态链接库问题失败。此时,可以考虑在脚本首行使用Shebang(如`#!/usr/bin/env python3`),并确保PM2有执行权限。但最可靠的方法依然是配置文件指定。 ## 2. 问题二:日志文件权限与目录不存在 脚本看起来启动了,状态是`online`,但你用`pm2 logs`却看不到任何输出,或者指定的日志文件始终没有生成。 **问题现象** - `pm2 logs` 命令输出为空,或者只有PM2自身的启动信息,没有你的`print`语句输出。 - 你配置了`error_file`和`out_file`到自定义目录(如`./logs/app.log`),但该目录下没有任何文件生成。 - 直接在终端运行脚本有输出,但交给PM2后输出就“消失”了。 **原因分析** 这通常是一个**权限或路径问题**。 1. **目录不存在**:PM2默认不会帮你创建日志目录。如果你在配置中指定了`./logs/err.log`,但项目根目录下根本没有`logs`文件夹,PM2尝试写入文件时就会失败。 2. **权限不足**:PM2进程(通常以`pm2`用户或启动它的系统用户运行)对目标日志文件或所在目录没有写入权限。这在你使用`sudo pm2 start`后又以普通用户查看时尤为常见,导致日志文件属于`root`,后续无法写入。 3. **输出被缓冲**:Python的标准输出(stdout)和标准错误(stderr)默认是行缓冲的。当输出被重定向到文件而非终端时,缓冲行为可能改变,导致日志内容不能及时写入,在脚本崩溃时丢失最后几条日志。 **解决命令与配置** 需要从目录、权限和缓冲三方面入手。 * **步骤1:确保日志目录存在并有权写入** ```bash # 在项目根目录下,创建日志目录并设置合适权限 mkdir -p logs chmod 755 logs # 确保PM2进程用户有读写执行权限 ``` 如果你不确定PM2以哪个用户运行,可以使用`pm2 info <app_name>`查看,或者简单地将目录权限设为`775`。 * **步骤2:在配置中明确日志路径,并考虑使用绝对路径** 在`ecosystem.config.js`中,避免使用相对路径的歧义。 ```javascript module.exports = { apps: [{ name: 'my-python-app', script: './app.py', interpreter: '/usr/bin/python3', // 使用绝对路径更可靠 error_file: '/var/log/myapp/err.log', out_file: '/var/log/myapp/out.log', // 或者基于当前目录构造绝对路径 // error_file: __dirname + '/logs/err.log', // out_file: __dirname + '/logs/out.log', }] }; ``` * **步骤3:解决Python输出缓冲问题** 对于日志不及时,可以在Python脚本中强制刷新输出缓冲区。 ```python # 在你的Python脚本开头或主循环中 import sys import os # 方法1:设置环境变量(在PM2配置的env中或启动前设置) # PYTHONUNBUFFERED=1 # 方法2:在代码中设置 sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) # Python 2 # 或使用 flush 参数 print("Some log", flush=True) # Python 3.3+ # 方法3:使用 -u 参数运行Python (在PM2的interpreter参数后添加) # interpreter: '/usr/bin/python3 -u', ``` 最推荐的方法是在PM2的`interpreter`配置中直接加上`-u`参数,或者设置环境变量`PYTHONUNBUFFERED=1`。 | 问题根源 | 检查方法 | 解决方案 | | :--- | :--- | :--- | | 目录不存在 | `ls -la /path/to/log/dir` | `mkdir -p` 创建目录 | | 权限不足 | `ls -l /path/to/log/file` | `chmod` 修改目录/文件权限,或 `chown` 更改属主 | | 输出缓冲 | 日志文件有内容但更新延迟 | 在PM2配置中添加 `-u` 参数或设置 `PYTHONUNBUFFERED=1` | ## 3. 问题三:虚拟环境依赖包加载失败(ModuleNotFoundError) 你的脚本在手动运行时一切正常,但通过PM2启动就疯狂报`ModuleNotFoundError: No module named 'xxx'`。 **问题现象** PM2日志中充斥着导入错误: ``` Traceback (most recent call last): File "/path/to/app.py", line 3, in <module> import requests ModuleNotFoundError: No module named 'requests' ``` 你确认在虚拟环境中已经用`pip install requests`安装过了。 **原因分析** 根本原因与**问题一**一脉相承,但更聚焦于**依赖路径**。即使你通过绝对路径指定了虚拟环境的Python解释器,有时仍可能遇到问题,因为: 1. **PYTHONPATH环境变量**:Python在导入模块时,会搜索`PYTHONPATH`环境变量中的路径以及解释器自身的`site-packages`。当PM2启动一个新进程时,它继承的环境变量可能不包含你的虚拟环境的`site-packages`路径。 2. **解释器与包路径不匹配**:你指定的解释器路径正确,但该Python环境的`site-packages`目录可能因为某种原因(如多版本Python混用、虚拟环境损坏)未被正确识别。 3. **用户级别的pip安装**:你可能曾经用`pip install --user`安装过某些包,这些包位于用户目录下。PM2进程(尤其是以`root`或特定服务用户运行时)无法访问当前用户的本地包目录。 **解决命令与配置** 确保PM2进程运行在与你开发时完全一致的Python环境中。 * **方案A:在PM2配置中激活虚拟环境(最彻底)** 与其只指定解释器,不如让PM2在启动脚本前先`source`激活虚拟环境。这可以通过一个小的包装脚本来实现。 1. 创建一个启动包装脚本(例如`start.sh`): ```bash #!/bin/bash # start.sh cd /absolute/path/to/your/project source .venv/bin/activate exec python your_script.py "$@" ``` 记得给这个脚本执行权限:`chmod +x start.sh`。 2. 修改PM2配置,指向这个shell脚本,并使用`bash`作为解释器: ```javascript module.exports = { apps: [{ name: 'my-python-app', script: './start.sh', // 改为执行包装脚本 interpreter: 'bash', // 解释器改为bash // ... 其他配置 }] }; ``` 这种方法模拟了你在终端中的手动操作,是最可靠的方式之一。 * **方案B:在配置中显式设置PYTHONPATH** 如果你知道虚拟环境中`site-packages`的具体路径,可以直接设置。 ```javascript module.exports = { apps: [{ name: 'my-python-app', script: './app.py', interpreter: '/path/to/.venv/bin/python', env: { // 将虚拟环境的site-packages路径添加到PYTHONPATH PYTHONPATH: '/path/to/.venv/lib/python3.9/site-packages:/path/to/your/project' }, }] }; ``` 你可以通过进入虚拟环境后执行 `python -c "import site; print(site.getsitepackages())"` 来找到准确的路径。 * **方案C:使用虚拟环境内的pip确保安装** 在部署时,确保使用虚拟环境内的pip安装所有依赖,避免全局或用户级别的安装冲突。 ```bash # 在项目目录下 /path/to/.venv/bin/pip install -r requirements.txt ``` ## 4. 问题四:进程僵尸化(Zombie)或无限重启循环 应用运行一段时间后,在`pm2 list`中状态显示为`stopped`、`errored`,但又没有明显的错误日志。或者更糟糕,进程进入“启动-崩溃-重启-再崩溃”的死循环,瞬间占满你的日志磁盘空间。 **问题现象** - 进程状态不稳定,频繁在`online`和`stopped`之间切换。 - `pm2 logs`显示进程不断重启,但每次报错信息可能很短或相同。 - 系统资源(如内存)在进程“死亡”后未被完全释放。 - 查看系统进程(`ps aux | grep python`)可能发现一些已经失去PM2父进程管理的“僵尸”Python进程。 **原因分析** 这通常是**资源管理或异常处理**的问题。 1. **未捕获的异常**:你的Python脚本可能抛出了一个未被`try...except`捕获的异常,导致进程直接退出。PM2的`autorestart`选项(默认为`true`)会立即重启它,如果异常是必然发生的(如数据库连接失败),就会形成循环。 2. **信号处理不当**:PM2在停止或重启应用时会发送信号(如SIGINT)。如果你的Python脚本没有正确设置信号处理器(例如,使用`signal.signal(signal.SIGINT, handler)`),它可能无法进行优雅的清理(如关闭数据库连接、保存状态)就直接退出,留下资源未释放。 3. **子进程管理缺失**:如果你的Python脚本又用`subprocess`启动了其他子进程,当主脚本被PM2终止时,这些子进程可能变成“孤儿进程”继续运行,造成资源泄漏。 4. **资源超限触发重启**:你设置了`max_memory_restart: '150M'`,但应用内存使用缓慢增长并最终超过这个限制,PM2会不断重启它。 **解决命令与配置** 需要从代码健壮性和PM2配置两方面进行加固。 * **步骤1:增强Python脚本的健壮性** ```python # app.py 示例增强 import signal import sys import logging from some_module import main_logic logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def graceful_shutdown(signum, frame): logger.info(f"接收到信号 {signum},开始优雅关闭...") # 执行清理工作:关闭数据库连接、保存文件、通知其他服务等 # ... logger.info("清理完成,退出。") sys.exit(0) # 注册信号处理器 signal.signal(signal.SIGTERM, graceful_shutdown) # PM2 stop 发送的信号 signal.signal(signal.SIGINT, graceful_shutdown) # Ctrl+C if __name__ == '__main__': try: # 将主逻辑放在try块中 main_logic() except KeyboardInterrupt: logger.info("用户中断") graceful_shutdown(signal.SIGINT, None) except Exception as e: # 捕获所有未预料异常,至少记录日志后再退出 logger.exception(f"程序因未处理异常退出: {e}") # 可以根据异常类型决定是否退出 sys.exit(1) # 非0退出码通常会被PM2标记为 errored ``` * **步骤2:调整PM2的重启策略** 在`ecosystem.config.js`中,利用PM2的重启策略避免疯狂循环。 ```javascript module.exports = { apps: [{ name: 'my-python-app', script: './app.py', interpreter: '/path/to/python', autorestart: true, // 发生异常自动重启 restart_delay: 3000, // 异常后等待3秒再重启,给外部服务恢复时间 max_restarts: 10, // 10秒内最多重启10次 min_uptime: '30s', // 运行不足30秒被认定为异常重启 // 结合使用,如果10秒内重启了10次,且每次运行都不足30秒,PM2会判定为不稳定,停止重启尝试。 watch: false, // 生产环境通常关闭文件监听重启 exp_backoff_restart_delay: 100, // 指数退避重启延迟基数 }] }; ``` `exp_backoff_restart_delay`和`max_restarts`的组合能有效防止网络短暂波动等瞬时错误导致的无限重启。 * **步骤3:管理子进程** 如果脚本有子进程,确保使用`subprocess`模块妥善管理,在主进程退出时终止它们。 ```python import subprocess import atexit proc = subprocess.Popen(['some_long_running_task']) def cleanup(): if proc.poll() is None: # 如果进程还在运行 proc.terminate() # 先尝试温和终止 try: proc.wait(timeout=5) # 等待5秒 except subprocess.TimeoutExpired: proc.kill() # 超时后强制杀死 proc.wait() atexit.register(cleanup) # 同时也可以在 signal handler 中调用 cleanup ``` ## 5. 问题五:内存泄漏与进程监控失准 Python进程的内存占用随着时间推移不断缓慢增长,即使业务量没有增加。或者,PM2报告的内存/CPU使用率与你用系统工具(如`htop`)看到的有显著差异。 **问题现象** - 在`pm2 monit`或`pm2 list`中,看到某个Python应用的内存使用量(`memory`列)持续上升,从不下降。 - 即使设置了`max_memory_restart`,重启后内存很快又涨上去。 - PM2显示的内存使用率是10%,但`htop`显示该Python进程占了30%的系统内存。 **原因分析** 这个问题分为两部分:**真实的内存泄漏**和**监控数据的不准确**。 1. **Python内存泄漏**:可能是由于全局变量不断累积、缓存未设置上限、循环引用未被垃圾回收(尤其是在使用C扩展或某些框架时)、或者打开了文件/网络连接未关闭。 2. **PM2监控的是Node.js子进程**:这是一个关键且常被误解的点。当你用`--interpreter python`时,PM2启动的是一个Node.js子进程,这个子进程再`fork`出你的Python进程。`pm2 list`中显示的`memory`和`cpu`,默认是**那个Node.js子进程**的资源使用情况,而不是你的Python进程!这个Node.js进程通常很轻量,所以数据看起来很低,具有误导性。 3. **Python多进程/线程**:如果你的Python脚本自己又启动了多进程或多线程,PM2的监控就更难反映真实情况了。 **解决命令与配置** 我们需要**准确监控**并**修复泄漏**。 * **步骤1:获取Python进程的真实资源使用情况** 不要完全依赖`pm2 list`。使用系统级工具: ```bash # 找到你的Python进程PID ps aux | grep python | grep -v grep # 或者通过PM2的PID查找子进程 pm2 pid <app_name> # 得到Node.js进程PID pstree -p <node_pid> # 查看其子进程,找到Python进程的PID # 使用 top 或 htop 实时监控该PID top -p <python_pid> # 或者使用更专业的工具 sudo apt-get install htop # 如果未安装 htop -p <python_pid> ``` * **步骤2:在PM2配置中启用“追踪模式”** 对于非Node.js应用,PM2的`fork_mode`可能无法准确收集指标。可以尝试使用`trace`模式,它通过操作系统钩子来收集子进程的资源使用情况,更准确但开销稍大。 ```javascript module.exports = { apps: [{ name: 'my-python-app', script: './app.py', interpreter: '/path/to/python', exec_mode: 'fork', // 默认就是fork // 启用追踪模式以获取更准确的子进程资源统计 trace: true, // 现在,max_memory_restart 将基于更准确的Python进程内存 max_memory_restart: '500M', }] }; ``` 配置后重启应用,`pm2 list`中的内存数据会变得更接近真实值。 * **步骤3:诊断和修复Python内存泄漏** 这是一个更深入的Python开发问题,但有一些通用排查思路: 1. **使用内存分析工具**:如`objgraph`, `pympler`, `tracemalloc`(Python标准库)来定位增长的对象。 ```python import tracemalloc tracemalloc.start() # ... 运行一段你的业务逻辑 ... snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') for stat in top_stats[:10]: # 查看前10个内存占用最大的位置 print(stat) ``` 2. **检查全局数据结构**:是否有全局的`list`、`dict`在不断追加数据而未清理?考虑使用有大小限制的缓存(如`functools.lru_cache`)或定期清理。 3. **检查资源关闭**:确保文件操作使用`with`语句,网络连接、数据库连接在使用后正确关闭。 4. **留意C扩展**:某些用C编写的库(如numpy、pandas的部分操作,或自定义C扩展)如果使用不当,可能导致内存不被Python的GC管理。 * **步骤4:合理设置PM2内存重启阈值** 在获得相对准确的内存监控后,`max_memory_restart`才能真正发挥作用。这个值应该设置为略高于你应用在正常稳定运行时的峰值内存。设置得太低会导致不必要的重启,太高则失去保护意义。需要通过一段时间的观察来确定。 ```javascript max_memory_restart: '800M' // 例如,观察到应用正常峰值在600M左右,留出200M缓冲 ``` 踩过这些坑之后,我最大的体会是:PM2管理Python脚本,成功的关键在于**明确性**和**隔离性**。明确指定解释器路径、明确日志文件位置、明确环境变量;同时理解PM2进程树的隔离性,虚拟环境的激活、子进程的资源统计都需要我们主动去管理和桥接。它不再是一个简单的`pm2 start`命令,而是一套需要精心编排的部署配置。当你把这些关节都打通,PM2就会成为你Python后端脚本、数据管道、定时任务等长时间运行服务最得力的守护者,提供不亚于其管理Node.js应用时的稳定性和可观测性。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

Python数据分析练习:北京、广州PM2.5空气质量分析

Python数据分析练习:北京、广州PM2.5空气质量分析

原创文章,通过一个PM2.5数据分析的案例,练习Python数据分析的技术,包括从csv文件中读取数据,使用pandas DataFrame对数据进行处理,数据可视化等技术。

Python_PM2.5:数据可视化

Python_PM2.5:数据可视化

Python_PM2.5:数据可视化

pm2.5爬虫python代码

pm2.5爬虫python代码

python,爬虫代码,爬取各城市PM2.5数据,并文档记录。

离线安装PM2,nodejs专用也可用于python

离线安装PM2,nodejs专用也可用于python

离线安装PM2,nodejs专用也可用于python。直接复制到目标电脑的任意目录中,加入环境变量或直接在该目录cmd的pm2直接使用。pm2命令自行百度

机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)

机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)

机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。机器学习大作业-基于线性回归的PM2.5预测系统python源码(期末大作业)个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做

使用PM2+nginx部署python项目的方法示例

使用PM2+nginx部署python项目的方法示例

主要介绍了使用PM2+nginx部署python项目的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Python获取PM2.5的实时数据

Python获取PM2.5的实时数据

使用requests和bs4 python库,获取PM2.5网站上的监测表格信息,使用findall查找行列,检索位置可以更换不同的市进行。

Python实现抓取城市的PM2.5浓度和排名

Python实现抓取城市的PM2.5浓度和排名

本文给大家介绍的是一则使用Python实现抓取城市的PM2.5数据和排名,

基于Python开发的PM2.5监测系统设计源码

基于Python开发的PM2.5监测系统设计源码

该项目为基于Python开发的PM2.5监测系统设计源码,包含22个文件,涵盖11个编译后的Python字节码文件(.pyc)、9个Python源代码文件(.py)、1个配置文件(.cfg)和1个Markdown文件(.md)。系统设计旨在实现对PM2.5污染物的监测与数据分析,适用于环境监测与治理等领域。

Python基础学习教程:如何用Python来写pm2.5空气质量查询程序.pdf

Python基础学习教程:如何用Python来写pm2.5空气质量查询程序.pdf

Python基础学习教程:如何⽤Python来写pm2.5空⽓质量查询程序 今天就教⼤家⽤之前有跟⼤家分享过的python基础学习教程完成⾸个MVP,如何⽤CLI(command-line interface,命令⾏界⾯)来执⾏第⼀ 个空⽓质量查询程序。 知识点 1. 如何进⾏txt⽂件的读取 2. 数据类型的转换 3. 列表 4. 字典 5. 在命令⾏界⾯下和程序进⾏交互 6. 条件判断 7. while循环 所需⼯具 python3 Notepad++、Sublime等任⼀编辑器 cmd、Terminal、pycharm等能执⾏命运界⾯ 天⽓数据⽂本⽂件 话不多说,带着⼤家开始梭哈~ 1.读取⽂件 本次主要涉及的是⽂本⽂件的读取, Python的⽂本⽂件的内容读取,有三种⽅法: 1. read(),读取整个⽂件,通常⽤于将整个⽂件内容放到⼀个字符串变量中; 2. readline(),逐⾏读取,当不需要读取整个⽂件时可以⽤; 3. readlines(),⼀次性读取⽂本内容,并⾃动将⽂件内容分析成⼀个⾏的列表。 这次采⽤readlines()来读取⽂件: pm25 = open('

Pm2.5数据自动采集代码-Python

Pm2.5数据自动采集代码-Python

采集PM2.5数据呢,就像获取天气预报信息有接口,通过Python对pm2.5数据进行采集存储

python抓取pm2.5

python抓取pm2.5

使用python语言,抓全国pm2.5实时数据 response = requests.request("GET", url, headers=headers) pattern = re.compile('data.*?pm2.5": (.*?), "class',re.S)

Python获取PM2.5实时数据

Python获取PM2.5实时数据

代码转载自:https://pan.quark.cn/s/5b04f5813b43 通过运用requests与bs4这两个Python库,可以采集PM2.5网站所提供的监测表格数据,借助findall功能识别表格中的行列元素,并且能够灵活调整检索的目标区域以适应不同城市的监测需求。

Python基于Django城市PM2.5空气质量数据可视化分析源码.zip

Python基于Django城市PM2.5空气质量数据可视化分析源码.zip

详情请查看资源内容中的使用说明

python获取全国城市pm2.5、臭氧等空气质量过程解析

python获取全国城市pm2.5、臭氧等空气质量过程解析

主要介绍了python获取全国城市pm2.5、臭氧等空气质量过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

基于线性回归的PM2.5预测系统python源码.rar

基于线性回归的PM2.5预测系统python源码.rar

基于线性回归的PM2.5预测系统python源码,包含了所有的数据以及代码。可供学习及设计参考。 # import library # import csv import numpy as np from numpy.linalg import inv import random import math import sys # read data # data = [] # 每一个维度存储一种污染物的数据,一共有18种污染物 for i in range(18): data.append([]) # []表示这十八个输入中,每一个输入都是一个列表 n_row = 0 # 初始从第0行开始 # 打开数据文件,文件big5编码为繁体字 text = open('D:/PythonCodes/CNN/train.csv', 'r', encoding='big5') # 读取名称为text的Excel文件,返回文件行的累加信息,类型为_csv.reader row = csv.reader(text , delimiter=",") # r中保存了当前行的所有信息

Python基于Django城市PM2.5空气质量数据可视化分析.zip

Python基于Django城市PM2.5空气质量数据可视化分析.zip

源码设计,具体请到资源详情查看使用前必读

【Python编程】Python元类与动态类创建技术

【Python编程】Python元类与动态类创建技术

内容概要:本文系统讲解Python元类(metaclass)的高级用法,重点对比type()动态创建与自定义元类在类创建拦截上的能力差异。文章从类创建的三阶段(准备命名空间 -> 执行类体 -> 创建类对象)出发,详解__new__与__init__在元类中的职责划分、__prepare__对类命名空间类型的定制、以及元类继承的MRO解析规则。通过代码示例展示单例模式(Singleton)的元类实现、ORM模型自动注册字段的元类方案、以及接口契约(ABCMeta)的抽象方法强制检查,同时介绍元类与装饰器的组合使用、元类冲突(metaclass conflict)的联合元类解决策略,最后给出在框架开发、插件系统、代码生成等场景下的元类设计原则与可维护性权衡。 24直播网:www.bjhtqczlgs.com 24直播网:www.papesons.com 24直播网:www.wn-zxw.com 24直播网:www.lfbag.com 24直播网:www.sxjuyaotengfei.com

【Python编程】Python虚拟环境与依赖管理方案

【Python编程】Python虚拟环境与依赖管理方案

内容概要:本文深入对比Python虚拟环境管理工具的技术特性,重点分析venv、virtualenv、conda、pipenv、poetry在环境隔离、依赖解析、锁定机制上的差异。文章从site-packages路径隔离原理出发,详解pip的requirements.txt语义、pipenv的Pipfile.lock确定性安装、以及poetry的pyproject.toml标准配置。通过代码示例展示conda的多语言包管理能力、pyenv的Python版本切换、以及docker在部署环境的一致性保证,同时介绍pip-tools的依赖编译工作流、renovate/dependabot的自动更新策略、以及私有PyPI仓库的搭建方案,最后给出在团队协作、生产部署、科学计算等场景下的环境管理最佳实践与可复现构建策略。

【Python编程】Python缓存策略与Redis集成实践

【Python编程】Python缓存策略与Redis集成实践

内容概要:本文系统讲解Python缓存层的设计模式与Redis集成方案,重点对比本地缓存(LRU/LFU)与分布式缓存(Redis/Memcached)在一致性、容量、并发上的权衡。文章从缓存穿透、缓存击穿、缓存雪崩三大经典问题出发,详解布隆过滤器(bloom filter)的空查询防御、互斥锁(mutex)的热点key保护、以及随机过期时间的错峰策略。通过代码示例展示redis-py的连接池配置、pipeline批量操作的事务优化、以及Lua脚本的原子性复合命令,同时介绍缓存更新模式(Cache-Aside/Write-Through/Write-Behind)的数据一致性保证、TTL与LRU淘汰策略的混合配置、以及多级缓存(本地+远程)的架构设计,最后给出在高并发Web服务、实时排行榜、会话存储等场景下的缓存设计原则与监控告警策略。 24直播网:zngtgroup.com 24直播网:m.hmdrqpj.com 24直播网:17155440000.com 24直播网:m.hengtongxiaodai.com 24直播网:m.pzsdxy.com

最新推荐最新推荐

recommend-type

PyPI 官网下载 | mlpack3-3.4.2-cp36-cp36m-manylinux1_x86_64.whl

资源来自pypi官网,解压后可用。 资源全名:mlpack3-3.4.2-cp36-cp36m-manylinux1_x86_64.whl
recommend-type

实现基于C++或者python基本库,初学学习之用.zip

人工智能-项目实践-机器学习
recommend-type

机器学习的一些基础算法,主要使用Python、Cpp、Matlab编写。.zip

matlab算法,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。
recommend-type

jenkins-conf:Jenkins的配置文件

mlpack Jenkins配置和测试支持 该存储库包含Jenkins( )使用的许多脚本,用于构建和测试mlpack。
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti
recommend-type

Java线程池运行时状态怎么实时掌握?有哪些靠谱的监控手段?

<think>我们之前已经讨论过Java线程池监控的多种方法,包括使用第三方工具和自定义监控。现在用户再次询问Java线程池监控方法,我们需要根据引用内容以及之前讨论的内容进行总结和扩展。 引用[1]提到使用JDK自带的监控工具,引用[2]提到了三种常用的线程池创建方式,引用[3]给出了通过ThreadPoolExecutor获取线程池状态的方法。 结合之前回答的内容,我们可以将监控方法分为以下几类: 1. 使用JDK自带工具(如jconsole, jvisualvm)进行监控。 2. 通过编程方式获取线程池状态(如引用[3]所示)。 3. 扩展ThreadPoolExecutor,