typecho 发布的文章

Python 控制程序超时的核心方法是强制中断阻塞的代码,最常用且安全的是  threading.Timer  线程定时器,复杂场景可使用  signal  信号(限 Unix 系统)或  concurrent.futures  线程池。

方法1:threading.Timer(通用、跨平台)

通过启动一个定时器线程,超时后触发自定义函数(如抛出异常)来中断主逻辑,适用于几乎所有场景。

python

import threading
import time

def timeout_handler():

"""超时后执行的函数,这里直接抛出异常终止程序"""
raise Exception("程序超时!已强制终止")

1. 设置超时时间(单位:秒)

timeout_seconds = 5

2. 启动定时器:超时后调用 timeout_handler

timer = threading.Timer(timeout_seconds, timeout_handler)
timer.start()

try:

# -------------- 替换为你的目标代码(如下载、等待等)--------------
print("开始执行任务,超时时间5秒...")
time.sleep(10)  # 模拟耗时超过超时时间的任务
print("任务正常完成(此句不会执行,因为会超时)")

finally:

# 3. 若任务提前完成,取消定时器(避免误触发)
timer.cancel()

 

方法2:concurrent.futures(适合函数级超时)

用线程池执行目标函数,直接通过  result()  方法设置超时时间,代码更简洁,适合给单个函数加超时。

python

from concurrent.futures import ThreadPoolExecutor
import time

def target_task():

"""需要控制超时的目标函数"""
print("任务开始...")
time.sleep(10)  # 模拟耗时任务
return "任务完成结果"

1. 创建线程池(仅1个线程)

with ThreadPoolExecutor(max_workers=1) as executor:

# 2. 提交任务并设置超时时间(5秒)
future = executor.submit(target_task)
try:
    # 3. 等待结果,超时则抛出 TimeoutError
    result = future.result(timeout=5)
    print("任务结果:", result)
except TimeoutError:
    print("任务超时!")

 

方法3:signal(仅 Unix 系统,如 Linux/macOS)

利用系统信号机制,超时后发送  SIGALRM  信号终止程序,效率高但不支持 Windows。

python

import signal
import time

def timeout_handler(signum, frame):

raise Exception("程序超时(signal 触发)")

1. 注册信号:超时后调用 timeout_handler

signal.signal(signal.SIGALRM, timeout_handler)

2. 设置超时时间(5秒)

signal.alarm(5)

try:

print("任务开始,超时5秒...")
time.sleep(10)  # 模拟超时任务
print("任务完成(不会执行)")

except Exception as e:

print(e)

finally:

# 3. 任务完成后取消信号(避免误触发)
signal.alarm(0)

 

需要我针对你的具体场景(比如之前的 VLC 播放控制),写一个带超时功能的完整示例代码吗?你只需告诉我具体超时时间即可。

在 Linux 中,ALSA 是底层硬件驱动框架,负责直接与声卡硬件通信;PulseAudio 是上层声音服务器,负责管理声音的路由、混音和跨应用音频分配,二者是“底层驱动+上层管理”的协作关系。

简单来说,ALSA 是“桥梁”,只负责把系统指令传给声卡硬件;PulseAudio 是“交通指挥官”,解决多个应用同时发声(如听歌时接微信语音)、调节不同应用音量等复杂需求。

需要我帮你整理一份在 Ubuntu 系统中,快速排查 PulseAudio 和 ALSA 声音故障的简易步骤吗?

Ubuntu 系统 PulseAudio 与 ALSA 声音故障排查简易步骤

1. 优先重启核心服务(最常用):打开终端,输入命令  systemctl --user restart pulseaudio ,重启 PulseAudio 服务,多数临时音频问题可解决。
2. 检查 ALSA 硬件识别:终端输入  aplay -l ,查看列表中是否有“card X”(X 为数字)的声卡设备,有则说明 ALSA 已识别硬件,无则需检查声卡驱动或硬件连接。
3. 图形化工具排查(适合新手):打开“设置 > 声音”,确认“输出设备”和“输入设备”选择正确(如耳机、扬声器),尝试切换设备并调节音量,排除设备选择错误问题。
4. 重置 PulseAudio 配置(解决顽固问题):终端依次输入以下命令,重置配置文件(需注销后重新登录生效):

  •  mv ~/.config/pulse ~/.config/pulse_old 
  •  systemctl --user restart pulseaudio 

如果按步骤操作后仍无声音,需要我帮你分析  aplay -l  或  pactl list sinks  命令的输出结果,进一步定位问题吗?

在不同的操作系统中,查看计算机打开端口的方法各有不同,以下是常见的操作方式:

  • Windows系统
  • 使用命令提示符 :按“Win+R”键,输入“cmd”并回车,打开命令提示符窗口。输入“netstat -ano”命令,可列出所有开放端口及其相关进程。若要查找特定端口的进程,可使用“netstat -ano | findstr :端口号”,将“端口号”替换为实际值。
  • 使用PowerShell :按下“Win+X”键,选择“Windows PowerShell”。输入“Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, State, OwningProcess”,可列出所有开放端口及其相关进程。查找特定端口的进程时,使用“Get-NetTCPConnection -LocalPort端口号 | Select-Object LocalAddress, LocalPort, State, OwningProcess”。
  • 使用任务管理器 :按下“Ctrl+Shift+Esc”键打开任务管理器,切换到“性能”选项卡,点击左下角的“打开资源监视器”,在资源监视器中切换到“网络”→“监听端口”,即可查看所有开放端口及其关联的进程。
  • Linux系统
  • 使用ss命令:在终端中输入“ss -tuln”命令,“-t”表示显示TCP端口,“-u”表示显示UDP端口,“-l”仅显示监听的端口,“-n”以数字形式显示端口号。
  • 使用netstat命令:若系统中安装了“net-tools”包,可使用“netstat -tuln”命令查看监听的端口,参数含义与“ss”命令类似。
  • 使用lsof命令:输入“sudo lsof -i -P -n | grep LISTEN”命令,“-i”显示网络连接,“-P”显示端口号而不是服务名称,“-n”避免解析域名。
  • Mac系统
  • 使用命令行:打开终端,输入“sudo lsof -i -P -n | grep LISTEN”命令,可查看正在监听的端口。也可以使用“netstat -an | grep LISTEN”命令来查看开放的端口。
  • 使用第三方工具:如Little Snitch等,这些工具可以直观地显示网络连接和端口使用情况,并且能够对网络活动进行监控和管理。

Linux 文件夹所有权获取(Ubuntu 适用)

核心命令(直接运行)

bash

1. 查看当前文件夹所有者及权限(替换为目标文件夹路径)

ls -ld /path/to/your/folder

2. 递归修改文件夹所有者为当前用户($USER 自动获取当前用户名)

sudo chown -R $USER:$USER /path/to/your/folder

3. (可选)设置合理权限(所有者可读可写可执行,其他只读)

sudo chmod -R 755 /path/to/your/folder
 

关键说明

  •  chown -R : -R  递归处理子文件/文件夹,避免仅改外层权限;
  •  $USER:$USER :前为用户名,后为用户组,确保用户完全掌控;
  • 若提示权限不足,必须加  sudo (管理员权限)。

需要我帮你编写一个 自动检测文件夹权限并修复的Python脚本 吗?可直接运行,无需手动输入路径和命令。

在Linux(以Ubuntu为例)中让脚本随系统启动,最常用且可靠的是 systemd服务 方式,以下是可直接实操的完整步骤和代码:

一、核心方法:创建systemd服务文件

1. 编写服务配置文件(以脚本  /home/yourname/startup_script.sh  为例):
bash

sudo nano /etc/systemd/system/auto_run_script.service
 
2. 粘贴以下内容(修改路径为你的脚本实际路径):
ini

[Unit]
Description=Auto run custom script on startup # 服务描述
After=network.target # 确保网络启动后再执行(可选,根据脚本需求调整)

[Service]
User=yourname # 执行脚本的用户(建议非root,填你的用户名)
WorkingDirectory=/home/yourname # 脚本工作目录
ExecStart=/bin/bash /home/yourname/startup_script.sh # 脚本执行命令
Restart=on-failure # 脚本失败时自动重启(可选)

[Install]
WantedBy=multi-user.target # 多用户模式下启动(兼容大多数场景)
 

二、启用并验证服务

1. 设置脚本可执行权限:
bash

chmod +x /home/yourname/startup_script.sh
 
2. 重载systemd配置并启动服务:
bash

sudo systemctl daemon-reload # 重新加载配置
sudo systemctl enable auto_run_script.service # 设置开机自启
sudo systemctl start auto_run_script.service # 立即启动服务
 
3. 验证服务状态:
bash

sudo systemctl status auto_run_script.service # 查看是否运行正常
 

  • 若显示  active (running)  则成功,失败可通过日志排查: sudo journalctl -u auto_run_script.service 

三、备用方法(适用于轻量场景):rc.local

1. 编辑rc.local文件:
bash

sudo nano /etc/rc.local
 
2. 在  exit 0  前添加脚本执行命令(需绝对路径):
bash

/bin/bash /home/yourname/startup_script.sh & # 末尾加&表示后台运行
exit 0
 
3. 设置权限并启用:
bash

sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local.service
 

关键注意事项

  • 脚本路径必须用 绝对路径(避免环境变量问题);
  • 若脚本需要访问网络/硬件,需在  After=  后添加对应依赖(如  network-online.target / udev.target );
  • 测试时可先执行  sudo systemctl start 服务名 ,确认脚本能正常运行后再设置开机自启。

需要我帮你根据具体脚本(如音乐播放脚本、种植环境监控脚本)生成定制化的systemd服务配置吗?