2020-01-06 20:40:02
有关ChakraCore介绍请移步:http://github.com/Microsoft/ChakraCore
使用案例GitHub源码:http://github.com/pyAppman/ChakraCore
参考文献有:http://xz.aliyun.com/t/2450 以及 http://bbs.125.la/forum.php?mod=viewthread&tid=14495171&highlight=ChakraCore
python是解释性语言,网上能搜到的基本都是C、C#、C++、易语言的ChakraCore使用,并没有python使用方法,参考了上面大佬们的相关介绍使用以及官方文档,写了如下可以成功调用的python例子。之所以写这个是因为:第一,暂目前python用于执行js的工具有node,pyv8,js2py,windows系统下的com组件,node性能不好,v8不够全安装费劲不说,对python2更友好,js2py运行小js还可以,大了就不行了,com不够全面比不上node内置的js函数,也不能跨平台,ChakraCore综合了node的全面跟v8的性能,还能跨平台。第二、网上也有不少关于ChakraCore的文章,但是没有python的,而易语言,C,C++这些并不是解释性语言,很多方面跟python不一样。第三、自己能力有限,过程中爬了很多坑,好似盲人过河,也算是想给其他有兴趣的人一点帮助
python解释器,本人用的32位python3.6.x,其他版本也可以,但是务必用32位,跟dll有关原因不多做说明。
封装的 ChakraCore.dll文件,源文件网上有,可以自行搜索下载,也可以http://github.com/pyAppman/ChakraCore上下载。
1、JsCreateRuntime(文档:http://github.com/microsoft/ChakraCore/wiki/JsCreateRuntime)
// 创建完整的JavaScript执行环境
2、JsCreateContext(文档:http://github.com/microsoft/ChakraCore/wiki/JsCreateContext)
// 创建一个执行js的上下文环境
3、JsSetCurrentContext(文档:http://github.com/microsoft/ChakraCore/wiki/JsSetCurrentContext)
// 表示一个拥有和别的execution contexts不同的JavaScript全局对象JavaScript的执行环境。
4、JsRunScript(文档:http://github.com/microsoft/ChakraCore/wiki/JsRunScript)
// 执行js
5、JsGetValueType(文档:http://github.com/microsoft/ChakraCore/wiki/JsGetValueType)
// 获取返回值类型(整型,字符串型,列表,字典等)
6、JsConvertValueToString(文档:http://github.com/microsoft/ChakraCore/wiki/JsConvertValueToString)
// 使用标准JavaScript语义将值转换为字符串。
7、JsStringToPointer(文档:http://github.com/microsoft/ChakraCore/wiki/JsStringToPointer)
// 检索字符串值的字符串指针。
8、JsDisposeRuntime(文档:http://github.com/microsoft/ChakraCore/wiki/JsDisposeRuntime)
// 处理runtime,类似于释放
1、加载dll,初始化数据
def __init__(self): self.source = '' self.dll = windll.LoadLibrary('ChakraCore.dll') self.init_source = '''(function(){%s;return %s})()''' self.count = 0 self.result = c_wchar_p('') self._runtime = c_long(0) self._context = c_long(0) self._result = c_long(0) self._type = c_long(0) self._res_ptr = c_long(0) self._length_ptr = c_long(0)
2、创建所需环境
def create_runtime(self): return self.dll.JsCreateRuntime(0, None, pointer(self._runtime)) def create_context(self): return self.dll.JsCreateContext(self._runtime, pointer(self._context)) def set_current_context(self): return self.dll.JsSetCurrentContext(self._context)
3、组合js代码
def compile(self, source): self.source = source
4、执行js并获取结果
def run(self, func, *args): if not self._runtime: self.create_runtime() self.create_context() self.set_current_context() target = '{name}{arg}'.format(name=func, arg=args) js = self.init_source % (self.source, target) self.count += 1 _run = self.dll.JsRunScript(c_wchar_p(js), self.count, c_wchar_p(''), pointer(self._result)) if _run: self.dispose() return 'JsRunScript Error!', False return_type = self.dll.JsGetValueType(self._result, pointer(self._type)) if return_type: self.dispose() return 'Js Return Type Error!', False if self._type.value == JsValueType_JsArray: self.dispose() return 'List wait', False if self.dll.JsConvertValueToString(self._result, pointer(self.result)): self.dispose() return 'JsConvertValueToString Error', False str_ptr = c_wchar_p('') u_ptr = c_int(0) res = self.dll.JsStringToPointer(self.result, pointer(str_ptr), pointer(u_ptr)) if res: self.dispose() return 'JsStringToPointer Error', False else: # print(str_ptr.value) # self.dispose() return str_ptr.value, True
5、释放runtime
def dispose(self): # self.dll.JsSetCurrentContext(0) self.result = c_wchar_p('') self.count = 0 self.dll.JsDisposeRuntime(self._runtime) def __exit__(self, exc_type, exc_val, exc_tb): self.result = c_wchar_p('') self.count = 0 self.dll.JsDisposeRuntime(self._runtime)
1 from ctypes import * 2 3 JsValueType_JsUndefined = 0 # 公开,该值是未定义的值。 4 JsValueType_JsNull = 1 # 公开,值为空值。 5 JsValueType_JsNumber = 2 # 公开,该值是JavaScript数值。 6 JsValueType_JsString = 3 # 公开,该值是JavaScript字符串值。 7 JsValueType_JsBoolean = 4 # 公开,该值是JavaScript布尔值。 8 JsValueType_JsObject = 5 # 公开,该值是JavaScript对象值。 9 JsValueType_JsFunction = 6 # 公开,该值是JavaScript函数对象值。 10 JsValueType_JsError = 7 # 公开,该值是JavaScript错误对象值。 11 JsValueType_JsArray = 8 # 公开,该值是JavaScript数组对象值。 12 JsValueType_JsSymbol = 9 # 公开,该值是JavaScript符号值。 13 JsValueType_JsArrayBuffer = 10 # 公开,该值是JavaScriptArrayBuffer对象值。 14 JsValueType_JsTypedArray = 11 # 公开,该值是JavaScript类型的数组对象值。 15 JsValueType_JsDataView = 12 # 公开,该值是JavaScriptDataView对象值。 16 17 18 class ChakraCore: 19 20 def __init__(self): 21 self.source = '' 22 self.dll = windll.LoadLibrary('ChakraCore.dll') 23 self.init_source = '''(function(){%s;return %s})()''' 24 self.count = 0 25 self.result = c_wchar_p('') 26 self._runtime = c_long(0) 27 self._context = c_long(0) 28 self._result = c_long(0) 29 self._type = c_long(0) 30 self._res_ptr = c_long(0) 31 self._length_ptr = c_long(0) 32 33 def compile(self, source): 34 self.source = source 35 36 def create_runtime(self): 37 return self.dll.JsCreateRuntime(0, None, pointer(self._runtime)) 38 39 def create_context(self): 40 return self.dll.JsCreateContext(self._runtime, pointer(self._context)) 41 42 def set_current_context(self): 43 return self.dll.JsSetCurrentContext(self._context) 44 45 def value(self, value): 46 if value == JsValueType_JsNumber: 47 self.result = c_float(0) 48 elif value == JsValueType_JsString: 49 self.result = c_wchar_p('') 50 if self.dll.JsConvertValueToString(self._result, pointer(self.result)): 51 return 'JsConvertValueToString Error' 52 str_ptr = c_wchar_p('') 53 u_ptr = c_int(0) 54 res = self.dll.JsStringToPointer(self.result, pointer(str_ptr), pointer(u_ptr)) 55 if res: 56 return 'JsStringToPointer Error' 57 else: 58 return str_ptr.value 59 elif value == JsValueType_JsArray: 60 self.result = (c_wchar * 10)() 61 elif value == JsValueType_JsObject: 62 self.result = {} 63 else: 64 self.result = None 65 66 def run(self, func, *args): 67 if not self._runtime: 68 self.create_runtime() 69 self.create_context() 70 self.set_current_context() 71 72 target = '{name}{arg}'.format(name=func, arg=args) 73 js = self.init_source % (self.source, target) 74 self.count += 1 75 _run = self.dll.JsRunScript(c_wchar_p(js), self.count, c_wchar_p(''), pointer(self._result)) 76 if _run: 77 self.dispose() 78 return 'JsRunScript Error!', False 79 return_type = self.dll.JsGetValueType(self._result, pointer(self._type)) 80 if return_type: 81 self.dispose() 82 return 'Js Return Type Error!', False 83 if self._type.value == JsValueType_JsArray: 84 self.dispose() 85 return 'List wait', False 86 if self.dll.JsConvertValueToString(self._result, pointer(self.result)): 87 self.dispose() 88 return 'JsConvertValueToString Error', False 89 str_ptr = c_wchar_p('') 90 u_ptr = c_int(0) 91 res = self.dll.JsStringToPointer(self.result, pointer(str_ptr), pointer(u_ptr)) 92 if res: 93 self.dispose() 94 return 'JsStringToPointer Error', False 95 else: 96 # print(str_ptr.value) 97 # self.dispose() 98 return str_ptr.value, True 99 100 def dispose(self): 101 # self.dll.JsSetCurrentContext(0) 102 self.result = c_wchar_p('') 103 self.count = 0 104 self.dll.JsDisposeRuntime(self._runtime) 105 106 def __exit__(self, exc_type, exc_val, exc_tb): 107 self.result = c_wchar_p('') 108 self.count = 0 109 self.dll.JsDisposeRuntime(self._runtime)
View Code
使用案例GitHub源码:http://github.com/pyAppman/ChakraCore
本文主要讲下python调用ChakraCore.dll
参考文献有:http://xz.aliyun.com/t/2450 以及 http://bbs.125.la/forum.php?mod=viewthread&tid=14495171&highlight=ChakraCore
欢迎大家补充,没有太多的python文档借鉴,是自己一步一个脚印,爬坑爬出来的,好似盲人摸象。写的不好,还请轻喷。
微软官方MBR无损转换GPT工具及使用方法
07-09
Windows 7系统使用系统修复光盘启动调用系统映像的恢复方法
03-15
Windows 8切换本地账户和微软帐号的方法
07-04
微软 Powertoys 推出新的实用程序,自定义键盘快捷管理
05-06
微软Office官方卸载工具
07-13
微软与戴尔等帮助美国政府在华为之外建设 5G
03-06
微软发现恶意 npm 软件包,可从 UNIX 系统窃取数据
01-15
微软网站microsoft网络账户密码更改
05-07
IdeaCentre B3系列电脑按下主机电源开关但无法开机的处理方法
07-24
IdeaCentre B5系列电脑自检时硬盘检测不到的处理方法
07-21
IdeaPad Y470、Y570 SRS Premium Sound音效软件的使用方法
07-22
Lenovo G550在Windows XP操作系统下触控板驱动安装方法
07-17
Linux文件查看/编辑方法介绍
07-17
MySQL InnoDB存储引擎崩溃恢复原理介绍
03-03
OpenResty json 删除转义符
07-16
T168 G6使用板载RAID1双盘掉线后的快速修复方法
07-23
Think产品无法进行无线上网的检测方法和解决方法
07-18
Ubuntu系统配置Nginx Node.js MongoDB环境
03-19
Win7系统下如何通过添加打印机方法安装打印机驱动程序?
07-15
wordpress重定向循环的几种解决方法
07-23
微软常用运行库合集 64位 v2018.10.28
34.36 MB
下载IV可视化引擎 v1.2.1 绿色版
172.5M
下载LabVIEW 2018注册机下载 v1.2绿色版 附激活方法
552 KB
下载MathWorks MATLAB R2019a破解补丁 附使用方法
18.61GB
下载迅雷资源搜索引擎下载
5.0M
下载金舟视频格式转换器 v3.8.8 电脑版 (附使用方法)
44.15M
下载飞象极速浏览器(智能双引擎浏览工具) v5.0.1.10 官方版
70.3M
下载Arnold for Maya下载
55.6M
下载Cutterman下载
1.3M
下载Hjsplit V2.3 汉化绿色免费版
427.3K
下载Muse CC 2017破解版
1.71MB
下载NVIDIA PhysX System Software v9.16.0318
28.41 MB
下载Powerstrip下载
1.28MB
下载Spreadjs(电子表格控件) v13.1.4 中文版
276.5M
下载Windows Media Player 11 v11.0.5721.5262
24.52 MB
下载msvcr80.dll
234 KB
下载南极星万年历(Njstar Calendar) v2.38 官方版
922K
下载扫描全能王 V1.0.0.1 官方版下载
33.94 MB
下载王码五笔86版官方
821.77 KB
下载