Windows环境下Python调用Subprocess.check_output执行Node.js无响应
解决CSS压缩工具替换后(YUI Compressor → CSSO)的Python调试问题
我太懂这种替换老工具后的调试噩梦了——YUI Compressor停更快10年,对新CSS选择器的兼容性bug确实忍无可忍,换成CSSO虽然功能更强,但它的命令行逻辑、异常输出和老工具完全不一样,很容易陷入“不知道命令跑没跑、错在哪”的盲区。
针对你提到的「无法调试命令执行状态及异常」的问题,我整理了一套实用的Python调试方案,既能精准定位问题,又能把混乱的调试语句梳理得更清晰:
1. 重构命令执行逻辑,捕获所有输出与异常
原来的代码可能只用了subprocess.call或者简单的Popen,没法拿到详细的输出信息。改用subprocess.run,并开启输出捕获和异常抛出,能让你一眼看到命令执行的全貌:
import subprocess def compress_css(input_path, output_path): # 带上CSSO的--debug参数,让它输出压缩过程的详细日志 csso_command = ["csso", input_path, "--output", output_path, "--debug"] print(f"[DEBUG] 即将执行命令: {' '.join(csso_command)}") try: # 捕获标准输出和错误输出,设置text=True直接拿到字符串格式 result = subprocess.run( csso_command, capture_output=True, text=True, check=True # 命令返回非0时直接抛出CalledProcessError ) print(f"[DEBUG] 命令执行成功,返回码: {result.returncode}") if result.stdout: print(f"[DEBUG] CSSO输出日志:\n{result.stdout}") if result.stderr: print(f"[DEBUG] CSSO警告信息:\n{result.stderr}") return True except subprocess.CalledProcessError as e: # 命令执行失败时,重点打印错误输出 print(f"[ERROR] 压缩命令执行失败,返回码: {e.returncode}") print(f"[ERROR] 错误详情:\n{e.stderr}") # 有时stdout里也会有失败前的线索,也可以打印出来 if e.stdout: print(f"[ERROR] 执行过程输出:\n{e.stdout}") return False except FileNotFoundError: print(f"[ERROR] 找不到CSSO可执行文件!请确认已全局安装CSSO(npm install -g csso),且路径已加入系统环境变量") return False except Exception as e: print(f"[ERROR] 意外错误: {str(e)}") return False
2. 拆分流程,每一步做前置检查与后置验证
流程变复杂后,把大逻辑拆成小步骤,每一步都做校验,能快速定位是哪一环出问题:
import os def check_input_validity(input_path): """检查输入文件是否存在且合法""" if not os.path.exists(input_path): print(f"[ERROR] 输入文件不存在: {input_path}") return False if not os.path.isfile(input_path): print(f"[ERROR] 输入路径不是文件: {input_path}") return False if os.path.getsize(input_path) == 0: print(f"[ERROR] 输入文件为空: {input_path}") return False return True def prepare_output_dir(output_path): """确保输出目录存在且有写入权限""" output_dir = os.path.dirname(output_path) if not output_dir: output_dir = os.getcwd() if not os.path.exists(output_dir): try: os.makedirs(output_dir) print(f"[DEBUG] 创建输出目录: {output_dir}") except Exception as e: print(f"[ERROR] 无法创建输出目录: {output_dir}, 错误: {str(e)}") return False if not os.access(output_dir, os.W_OK): print(f"[ERROR] 输出目录无写入权限: {output_dir}") return False return True def verify_output_result(output_path): """验证压缩后的文件是否有效""" if not os.path.exists(output_path): print(f"[ERROR] 压缩文件未生成: {output_path}") return False if os.path.getsize(output_path) == 0: print(f"[ERROR] 压缩文件为空: {output_path}") return False print(f"[INFO] 压缩完成!输出文件: {output_path}") return True # 整合所有步骤的主函数 def process_css_compression(input_path, output_path): if not check_input_validity(input_path): return False if not prepare_output_dir(output_path): return False if not compress_css(input_path, output_path): return False return verify_output_result(output_path)
3. 调试时的小技巧
- 先手动在终端执行一遍CSSO命令,确认命令本身能正常运行,排除环境配置问题
- 如果遇到特定CSS选择器的问题,可以把输入文件简化成只包含有问题的选择器,单独测试压缩效果
- CSSO的
--stat参数可以输出压缩统计信息,帮你确认压缩是否真的生效
这样调整后,你就能通过日志清晰看到每一步的状态:是输入文件不对?还是CSSO命令报错?还是输出目录没权限?再也不用对着一堆杂乱的调试语句摸不着头脑了。
内容的提问来源于stack exchange,提问作者aphid
相关产品推荐
相关产品推荐

