python使⽤execjs执⾏js
python 执⾏js代码
简单调⽤
import execjs
execjs.eval("new Date")
返回值为: 2018-04-04T12:53:17.759Z
execjs.eval("w()")
返回值为:1522847001080 # 需要注意的是返回值是13位,区别于python的time.time()
需要注意的是:个别的JS语句,⽤execjs返回的结果跟浏览器环境返回的结果是有区别的,以下是浏览器环境返回的结果
调⽤函数
import execjs
ctx = execjspile("""
function add(x, y) {
return x + y;
}
""") # 获取代码编译完成后的对象
print(ctx.call("add", 1, 2)) # 3
# print(ctx.eval("add({0},{1})").format(1,2)) # 报错
print(ctx.eval('add("{0}", "{1}")').format("1","2")) # 12
⽂件读取代码编写
创建jsCode.js的⽂件
function add(x, y) {
return x + y;
}
执⾏代码
import execjs
file = 'jsCode.js'
ctx = execjspile(open(file).read())
js = 'add("{0}", "{1}")'.format("1","2")
params = ctx.eval(js)
print(params) # 12
params = ctx.call('add',1,2)
print(params) # 3
出现错误提⽰
UnicodeEncodeError: 'gbk' codec can't encode character xxx
解决⽅案⼀
添加encoding="utf-8"
ctx = execjspile(open(file,encoding="utf-8").read())
解决⽅案⼆
js⽂件以GBk⽅式保存
执⾏JS的环境
在windows上不需要其他的依赖便可运⾏execjs,也可以调⽤其他的JS环境
windows 默认的执⾏JS的环境
<().name
返回值: JScript
作者本⼈的windows上装有Node.js ,所以返回值不同
<().name
返回值: Node.js (V8)
在ubuntu下需要安装执⾏JS环境依赖, 环境为PhantomJS
<().name
返回值: PhantomJS
源码中给出,可执⾏execjs的环境:
PyV8 = "PyV8"
Node = "Node"
JavaScriptCore = "JavaScriptCore"
SpiderMonkey = "SpiderMonkey"
JScript = "JScript"
PhantomJS = "PhantomJS"
SlimerJS = "SlimerJS"
Nashorn = "Nashorn"
在ubuntu环境下,没有JS环境会报错:Could not find an available JavaScript runtime. 由此可见, execjs在ubuntu需要安装JS环境。具体的JS环境需根据具体的需求安装,切不可超过以上8种。
python2执⾏执⾏js⽂件使⽤pyv8
环境切换
通过os.environ
<().name
execjs.eval("1 + 2")
通过 切换
jscript = (execjs.runtime_names.JScript) # runtime_names 便是execjs源码中给出的执⾏环境的。 execjs. xxx必须在上⼀节 #3中取jscript.eval("1 + 2")
注: 在切换环境时,当环境不存在不会报错,会使⽤默认的环境。另外需要注意的是,两种⽅式的区别
简易性能分析
# 只简单试了三种,在windows下
import execjs
import os
import time
# 先⽤JScript
().name
time1 = time.time()
for i in range(100):
execjs.eval("new Date")
print time.time() - time1
# 切换环境使⽤Nodejs
().name
time2 = time.time()
for l in range(100):
execjs.eval("new Date")
print time.time() - time2
# 打印的结果为:
JScript
4.70900011063
Node.js (V8)
27.501999855
# 在ubuntu下试的是PhantoJS ,结果竟然⾼达 30+ S
此注释来⾃execjs作者:PyExecJS的缺点之⼀就是性能。PyExecJS通过⽂本传递JavaScript运⾏时,并且速度很慢。另⼀个缺点是它不完全⽀持运⾏时特定的功能。对于某些⽤例,PyV8可能是更好的选择。
总注:使⽤execjs的难点并不是在execjs这个库,⽽是解析JS的过程,因为没有浏览器的环境,没有加密源码的依赖。从成千上万⾏的JS 中择出想要的内容,可能是⼀段孤零零的JS函数,也可能是从⼏个JS⽂件去出各⾃出⼀段JS代码,并可以通过execjs顺利执⾏,这并⾮易事。需要慢慢积累经验。⼀旦掌握,便可以提⾼爬⾍的效率,以及代码的健壮性,节省资源!
⼩编在运⾏是遇见个问题
execjs._exceptions.ProgramError:SyntaxError
execjs._exceptions.ProgramError:SyntaxError
运⾏ ().name)
().name)
发现
终端和解释器的返回值不⼀样
解释器的结果为:JScript
终端的结果为:Node.js (V8)
⼀直报这个问题
怀疑是否和node的版本有关
于是升级到了最新版依然没⽤
然后⼜猜想是否和⽤户的权限有关
代码运行js特效于是⽤管理员的权限运⾏
发现这下解释器的结果为:Node.js (V8)
这下发现原因了原来是每次打开pycharm的⽤户权限不够
这下重启pycharm问题解决了,开⼼
如果你觉得以上⽅法觉得⿇烦的话点击下⾯这个链接⾥⾯有python 调⽤ js 不⽤安装nodejs就能⽤的⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论