【问题标题】:Subprocess.check_output does nothing for node.js on windows?Subprocess.check_output 对 Windows 上的 node.js 没有任何作用?
【发布时间】:2018-04-18 10:01:13
【问题描述】:

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

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

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

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/csso 下的文件来安装的。 name 是一个字符串,包含原始 css 文件的相对路径(通常类似于 ../../domains\mydomain.com\templates\css\style.css),而 outname 始终与 name 相同,但扩展名更改为 .min.css

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

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

## 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)回显它执行的确切命令,以及确切的路径,所以我可以手动复制它,至少排除构造中的任何错误引号中的命令或差异等?理想情况下可能是二进制文件,因为这看起来像“两件事看起来完全相同但并不”有趣

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

【问题讨论】:

    标签: python node.js windows cmd csso


    【解决方案1】:

    我已设法诊断出问题。

    在 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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2020-12-05
      • 2013-08-12
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多