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。
答案 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)
切换版本对我来说没有任何改变,我发现了另一个解决方法:只需删除(或移动,如果要谨慎)提到的文件(Date
和yourpython/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