PyExecJS 踩坑

因为做爬虫模拟登录某网站需要解析jother.我就用python写了一个脚本.让java服务端直接调用.

代码

1
2
3
4
5
6
7
8
9
10
11
12
# coding=utf-8
import sys

import execjs


def exec_js_function(code):
# 需要安装PyExecJS 执行命令: pip install PyExecJS
ctx = execjs.compile('''function getJother(){document = ''; return %s}''' % code)
print (ctx.call("qzonetoken"))

exec_js_function(sys.argv[1])

问题

本地执行ok.
测试库执行ok.
生产环境执行挂了….

报错日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/execjs/_abstract_runtime_context.py", line 37, in call
return self._call(name, *args)
File "/usr/lib/python2.7/site-packages/execjs/_external_runtime.py", line 92, in _call
return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
File "/usr/lib/python2.7/site-packages/execjs/_external_runtime.py", line 78, in _eval
return self.exec_(code)
File "/usr/lib/python2.7/site-packages/execjs/_abstract_runtime_context.py", line 18, in exec_
return self._exec_(source)
File "/usr/lib/python2.7/site-packages/execjs/_external_runtime.py", line 88, in _exec_
return self._extract_result(output)
File "/usr/lib/python2.7/site-packages/execjs/_external_runtime.py", line 167, in _extract_result
raise ProgramError(value)
execjs._exceptions.ProgramError: java.lang.RuntimeException: Method code too large!

问题排查

看到报java异常我也是醉了.研究了半天,期间还升级了一下python和jdk的小版本.让它跟测试库一样,发现还是不行.
真的是搞得我头大.网站上也没有任何相关问题.于是就上PyExecJS官网查看.发现需要node支持… 于是装了node.问题解决.

问题总结

1.大部分人不会遇到这个问题应该是大部分机器都有装node吧.
2.没有装node的时候,PyExecJS也可以执行,但是执行超长的jother时就挂了.这也是我一开始没有怀疑是不是execjs的问题.