You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:41:17