PyInstaller单文件程序崩溃遗留旧目录的清理方案咨询
临时清理PyInstaller残留/tmp目录的可行方案
针对你遇到的PyInstaller 3.6打包Python2.7单文件程序崩溃后/tmp/_MEIxxxxxx目录残留的问题,以下是几个更优的临时解决办法:
1. 自定义实例专属临时目录(结合启动脚本)
利用PyInstaller读取环境变量指定临时目录父路径的特性,通过启动脚本为每个实例生成独立的父目录,既保证多实例隔离,又方便后续精准清理:
- 编写shell启动脚本
run_my_prog.sh:#!/bin/bash # 创建以当前PID为标识的临时父目录 INSTANCE_TMP_DIR="/tmp/my_prog_inst_$$" mkdir -p "$INSTANCE_TMP_DIR" # 指定PyInstaller运行时临时目录的父路径 export PYINSTALLER_TEMP="$INSTANCE_TMP_DIR" # 启动程序 ./my_prog "$@" # 程序正常退出时清理目录(崩溃时无法执行,需外部清理) rm -rf "$INSTANCE_TMP_DIR" - 清理逻辑:定期扫描所有
/tmp/my_prog_inst_*目录,检查目录下的_MEIxxxxxx子目录对应的进程是否存活(通过目录名中的PID,或用lsof检查目录内文件是否被占用),无活跃进程则删除整个父目录。
2. 给程序添加PID标记文件
在你的Python代码启动时,自动在PyInstaller的临时目录中写入PID文件,方便清理脚本精准识别活跃实例:
- 在程序入口处添加代码:
import os import sys if hasattr(sys, '_MEIPASS'): # 获取PyInstaller临时目录路径 tmp_dir = sys._MEIPASS # 写入PID文件 pid_file = os.path.join(tmp_dir, 'my_prog.pid') with open(pid_file, 'w') as f: f.write(str(os.getpid())) - 清理脚本逻辑:
将该脚本加入cron(如每30分钟执行一次),或用systemd timer按需触发。#!/bin/bash for dir in /tmp/_MEI*; do # 检查是否是目标程序的临时目录 if [ -f "$dir/my_prog.pid" ]; then pid=$(cat "$dir/my_prog.pid") # 检查进程是否存活 if ! ps -p "$pid" > /dev/null; then rm -rf "$dir" fi fi done
3. 临时Patch PyInstaller Bootloader(支持运行时指定解压目录)
如果你能接受修改PyInstaller的bootloader代码,可以添加--unpack-to-dir参数支持,让每个实例指定自己的解压目录:
- 找到PyInstaller 3.6的bootloader源码(
bootloader/src/unix/main.c),在命令行参数解析部分添加逻辑,识别--unpack-to-dir <path>参数,将临时目录设置为指定路径。 - 重新编译bootloader,打包程序时使用修改后的bootloader。
- 启动程序时指定
./my_prog --unpack-to-dir /tmp/my_prog_inst_$$,崩溃后可直接根据指定路径清理无活跃进程的目录。
注意事项
- 所有清理操作必须先验证目标目录对应的进程是否存活,避免误删正在运行的实例文件。
- 自定义临时目录时,确保目录权限为当前用户可读写,避免程序启动失败。
内容的提问来源于stack exchange,提问作者paxdiablo
相关产品推荐
相关产品推荐

