Ubuntu终端使用LibreOffice将doc转换为docx时卡住问题求助
问题原因分析
- 命令拼接存在解析漏洞:你当前使用
os.system拼接字符串的方式,如果文件名包含单引号、空格或者其他特殊字符,会直接导致命令参数解析错误,LibreOffice会因为找不到目标文件或识别到非法参数陷入异常挂起状态,你看到的异常文件就是转换中断后没有被正常清理的缓存文件。 - 格式兼容触发bug:部分老旧版本的.doc文件(比如97版之前的DOC、包含损坏宏、嵌入对象损坏的DOC文件)会触发LibreOffice的解析bug,导致进程死锁,既无法正常退出也无法生成目标文件。
- 进程冲突:如果后台已经有运行中的LibreOffice进程,新启动的lowriter转换命令会默认复用已有进程,若已有进程处于卡死状态,新的转换任务也会直接卡住。
可行修复方案
- 修正命令调用逻辑,替换
os.system为更安全的subprocess模块,避免特殊字符注入风险,同时增加超时控制,示例代码如下:
import subprocess import sys if entry.lower().endswith('.doc'): if sys.platform.startswith('linux'): print(entry) # 用参数列表传递命令,自动处理特殊文件名 cmd = [ 'lowriter', '--headless', # 启用无头模式,不启动GUI,减少异常概率 '--convert-to', 'docx', '--outdir', './', # 明确指定输出目录,避免权限问题 entry ] try: # 300秒超时阈值可根据文件平均大小自行调整 subprocess.run(cmd, check=True, timeout=300, capture_output=True) except subprocess.TimeoutExpired: print(f"转换超时:{entry},已跳过") # 可额外记录失败文件路径,后续集中人工处理 except subprocess.CalledProcessError as e: print(f"转换失败:{entry},错误信息:{e.stderr.decode()}")
- 每次执行转换前清理残留的LibreOffice进程,避免进程冲突,可执行命令
pkill -f "libreoffice\|lowriter",如果是多用户共用的服务器可调整过滤规则避免误杀其他用户的进程。 - 针对超时/转换失败的文件增加兜底方案,比如安装
antiword工具,直接提取老旧DOC文件的文本内容,就算无法转成DOCX也能拿到核心文本数据,不会完全丢失文件内容。 - 可先用
catdoc读取失败文件的文件头,确认文件格式合法性,排除是后缀名伪造的非DOC文件导致的转换失败。
内容的提问来源于stack exchange,提问作者tristan19954
相关产品推荐
相关产品推荐

