Subprocess.check_output对windows上的node.js什么都不做?

时间:2018-04-18 10:01:14

标签: python node.js windows cmd csso

我的自动缩小工具有一个奇怪的问题。我不得不用csso替换yuicompressor,因为yuicompressor自2013年以来没有更新,并且有许多新的css选择器的错误。

这增加了复杂性(如涉及“东西”的数量)到我不知道如何使用执行的命令调试问题的程度。 (或者即使它被执行了)。

我基本上把我的问题缩小到以下python代码片段(目前有很多添加的调试语句来帮助诊断问题):

print("node " + os.path.join(getScriptPath(), "css", "csso", "bin", "csso") 
    + " -i " + os.path.join(root, name) + " -o " + os.path.join(root, outname) + " --debug")
os.remove(os.path.join(root, outname))
try:
    result = subprocess.check_output(["node",
        os.path.join(getScriptPath(), "css", "csso", "bin", "csso"),  
        "-i", os.path.join(root, name),
        "-o", os.path.join(root, outname), 
        "--debug"
        ], stderr=subprocess.STDOUT, shell=True)    
except subprocess.CalledProcessError as exc:
    print("ERROR: Failed to execute CSSO with error:", exc.returncode, exc.output)

请注意,getScriptPath()是一个小帮助函数,它返回脚本文件所在的当前路径。通过在csso下手动复制文件来安装css/csso/bin/cssoname是一个字符串,其中包含原始css文件的相对路径(通常类似于../../domains\mydomain.com\templates\css\style.css),而outname始终与name相同,但扩展名已更改到.min.css

如果我复制&将第一个print()调用的结果直接粘贴到cmd终端,csso将运行并缩小我的文件。但是,如果我调用一个运行python程序的批处理脚本,该程序最终运行上面的代码(作为它所做的事情的一部分),什么也没做,没有输出

subprocess.run调用曾经是一个简单的shell调用,没有输出。然而,我 仍然 没有输出。这是我通过手动运行它获得的一些示例输出(在stderr中):

## parsing done in 16 ms

Compress block #1
[0.000s] init
[0.000s] clean
[0.015s] replace
[0.000s] prepare
[0.000s] mergeAtrule
[0.000s] initialMergeRuleset
[0.000s] disjoinRuleset
[0.016s] restructShorthand
[0.000s] restructBlock
[0.000s] mergeRuleset
[0.016s] restructRuleset
## compress done in 47 ms

## generate done in 0 ms

(python版本的当前输出显示为空。如果它包含任何数据,则所有字节在标准cmd工具中打印为空。

一个想法是:有没有办法让subprocess.run(或shell)回显它执行的确切命令,并从确切的路径,所以我可以手动复制它,至少排除构造命令的任何错误或引号中的差异等?理想情况下可能是二进制文件,因为它看起来像'两件事看起来完全相同但不是'有趣

其他相关标签: 批量,缩小。

1 个答案:

答案 0 :(得分:0)

我设法诊断出这个问题。

在Windows上,有多种不同的PATH变量。发生问题的计算机在安装node.js后没有重新启动,并且PATH直接可用于cmd,但不能用于仍然使用旧变量的python。因此它出错了;节点不存在。

由于某些原因,我仍然不知道错误是用原始代码沉默的。但是,在它们之间添加这两行(由>>>表示)将导致程序打印两个命令的结果(而不是两者):

 >>> result2 = subprocess.check_output("echo \"Hello World\"", stderr=subprocess.STDOUT, shell=True)  
    except subprocess.CalledProcessError as exc:
        print("ERROR: Failed to execute CSSO with error:", exc.returncode, exc.output)
    print(result.decode())
    >>> print(result2.decode())