Python slimit minimizer不需要的警告输出

时间:2017-06-12 15:59:49

标签: python python-2.7

from slimit import minify


if __name__ == "__main__":
    print("start")

    # Normally, I pass real JavaScript. For this issue, an empty string reproduces problem.
    minify("", mangle=True)

    print("exit")

这会触发以下控制台输出。

start
WARNING: Couldn't write lextab module <module 'slimit.lextab' from '/Users/kurtostfeld/samba/wrapad/venv/lib/python2.7/site-packages/slimit/lextab.pyc'>. Won't overwrite existing lextab module
WARNING: yacc table file version is out of date
WARNING: Token 'IMPORT' defined, but not used
WARNING: Token 'BLOCK_COMMENT' defined, but not used
WARNING: Token 'ENUM' defined, but not used
WARNING: Token 'EXTENDS' defined, but not used
WARNING: Token 'LINE_COMMENT' defined, but not used
WARNING: Token 'LINE_TERMINATOR' defined, but not used
WARNING: Token 'CONST' defined, but not used
WARNING: Token 'EXPORT' defined, but not used
WARNING: Token 'CLASS' defined, but not used
WARNING: Token 'SUPER' defined, but not used
WARNING: There are 10 unused tokens
WARNING: Couldn't create <module 'slimit.yacctab' from '/Users/kurtostfeld/samba/wrapad/venv/lib/python2.7/site-packages/slimit/yacctab.pyc'>. Won't overwrite existing tabmodule
exit

这些警告充斥着我的应用程序控制台输出。如何在不产生警告的情况下使用minify?

我正在使用Python 2.7.12,以及目前最新的库版本:slimit 0.8.1,ply 3.10。

5 个答案:

答案 0 :(得分:3)

根据to this issue on Github,slimit取决于ply软件包。经过几次尝试,似乎这些警告从ply的3.8版开始出现。 。您可以将ply更新为3.6,这是没有这些消息的最新版本:

pip uninstall ply -y && pip install ply==3.6

它解决了我的问题。

更新 由于我的某些测试失败,因此安装较早版本的ply确实是一个不好的工作。原始的slimit版本似乎维护得不好,因此我建议更新到更高的版本metatoaster did a good job to improve it并解决警告消息的问题。对我来说,解决方案是卸载slimit,然后安装其版本:

pip install git+https://github.com/metatoaster/slimit.git#egg=slimit

最终更新实际上,slimit似乎不再需要维护,其后继者称为calmjs,虽然差别不大,但实际上更加稳定,因此没有显示这些烦人的警告消息。参见:https://github.com/calmjs/calmjs.parse

答案 1 :(得分:2)

Slimit使用了ply,它使用了stdlib中的logging。 AFAICS slimit不允许您传递ply的{​​{1}}和lex期望的日志记录参数。

虽然您不能(直接)访问yacc的日志记录,但您应该可以在提升全局日志记录级别时禁止这些消息:

ply

答案 2 :(得分:2)

切换版本对我来说没有任何改变,我发现了另一个解决方法:只需删除(或移动,如果要谨慎)提到的文件(Dateyourpython/site-packages/slimit/yacctab.py)。

我相信该模块将重新创建这些文件,并不再为您打扰警告消息。

答案 3 :(得分:1)

您也可以使用此解析器:https://github.com/PiotrDabkowski/pyjsparser

它有效且易于使用。但是它不处理评论。 (calmjs似乎都不能完全处理评论:它的parse函数具有一个参数,指示您想要评论,但是到目前为止,有些评论似乎已经丢失。)

答案 4 :(得分:0)

这是我参与的解决方案。我制作了两个slimit函数的自定义变体,可以对errorlog=ply.yacc.NullLogger()函数进行额外的ply.yacc.yacc调用。

class SlimitNoLoggingParser(Parser):
    """
    This is a simple customized variant to slimit.parser.Parser.

    The only difference is that this passes a errorlog=ply.yacc.NullLogger() to ply.yacc.yacc to suppress unwanted
    stderr logging output.
    """

    def __init__(self, lex_optimize=True, lextab=lextab,
                 yacc_optimize=True, yacctab=yacctab, yacc_debug=False):
        self.lex_optimize = lex_optimize
        self.lextab = lextab
        self.yacc_optimize = yacc_optimize
        self.yacctab = yacctab
        self.yacc_debug = yacc_debug

        self.lexer = Lexer()
        self.lexer.build(optimize=lex_optimize, lextab=lextab)
        self.tokens = self.lexer.tokens

        self.parser = ply.yacc.yacc(
            module=self, optimize=yacc_optimize,
            errorlog=ply.yacc.NullLogger(),
            debug=yacc_debug, tabmodule=yacctab, start='program')

        # https://github.com/rspivak/slimit/issues/29
        # lexer.auto_semi can cause a loop in a parser
        # when a parser error happens on a token right after
        # a newline.
        # We keep record of the tokens that caused p_error
        # and if the token has already been seen - we raise
        # a SyntaxError exception to avoid looping over and
        # over again.
        self._error_tokens = {}


# This is a simply variant of slimit.minify that suppresses unwanted noisy stderr logging output.
def warning_free_minify(text, mangle=False, mangle_toplevel=False):
    parser = SlimitNoLoggingParser(lex_optimize=False)
    tree = parser.parse(text)
    if mangle:
        mangler.mangle(tree, toplevel=mangle_toplevel)
    minified = ECMAMinifier().visit(tree)
    return minified