有关ChakraCore介绍请移步:https://github.com/Microsoft/ChakraCore

使用案例GitHub源码:https://github.com/pyAppman/ChakraCore

本文主要讲下python调用ChakraCore.dll

参考文献有:https://xz.aliyun.com/t/2450 以及 https://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文件,源文件网上有,可以自行搜索下载,也可以https://github.com/pyAppman/ChakraCore上下载。

二、ChakraCore的部分方法(按顺序执行)

1、JsCreateRuntime(文档:https://github.com/microsoft/ChakraCore/wiki/JsCreateRuntime

// 创建完整的JavaScript执行环境

2、JsCreateContext(文档:https://github.com/microsoft/ChakraCore/wiki/JsCreateContext

// 创建一个执行js的上下文环境

3、JsSetCurrentContext(文档:https://github.com/microsoft/ChakraCore/wiki/JsSetCurrentContext

// 表示一个拥有和别的execution contexts不同的JavaScript全局对象JavaScript的执行环境。

4、JsRunScript(文档:https://github.com/microsoft/ChakraCore/wiki/JsRunScript

// 执行js

5、JsGetValueType(文档:https://github.com/microsoft/ChakraCore/wiki/JsGetValueType

// 获取返回值类型(整型,字符串型,列表,字典等)

6、JsConvertValueToString(文档:https://github.com/microsoft/ChakraCore/wiki/JsConvertValueToString

// 使用标准JavaScript语义将值转换为字符串。

7、JsStringToPointer(文档:https://github.com/microsoft/ChakraCore/wiki/JsStringToPointer

// 检索字符串值的字符串指针。

8、JsDisposeRuntime(文档:https://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)

  

四、所有源码如下:

 from ctypes import *

 JsValueType_JsUndefined = 0  # 公开,该值是未定义的值。
JsValueType_JsNull = 1 # 公开,值为空值。
JsValueType_JsNumber = 2 # 公开,该值是JavaScript数值。
JsValueType_JsString = 3 # 公开,该值是JavaScript字符串值。
JsValueType_JsBoolean = 4 # 公开,该值是JavaScript布尔值。
JsValueType_JsObject = 5 # 公开,该值是JavaScript对象值。
JsValueType_JsFunction = 6 # 公开,该值是JavaScript函数对象值。
JsValueType_JsError = 7 # 公开,该值是JavaScript错误对象值。
JsValueType_JsArray = 8 # 公开,该值是JavaScript数组对象值。
JsValueType_JsSymbol = 9 # 公开,该值是JavaScript符号值。
JsValueType_JsArrayBuffer = 10 # 公开,该值是JavaScriptArrayBuffer对象值。
JsValueType_JsTypedArray = 11 # 公开,该值是JavaScript类型的数组对象值。
JsValueType_JsDataView = 12 # 公开,该值是JavaScriptDataView对象值。 class ChakraCore: 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) def compile(self, source):
self.source = source 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) def value(self, value):
if value == JsValueType_JsNumber:
self.result = c_float(0)
elif value == JsValueType_JsString:
self.result = c_wchar_p('')
if self.dll.JsConvertValueToString(self._result, pointer(self.result)):
return 'JsConvertValueToString Error'
str_ptr = c_wchar_p('')
u_ptr = c_int(0)
res = self.dll.JsStringToPointer(self.result, pointer(str_ptr), pointer(u_ptr))
if res:
return 'JsStringToPointer Error'
else:
return str_ptr.value
elif value == JsValueType_JsArray:
self.result = (c_wchar * 10)()
elif value == JsValueType_JsObject:
self.result = {}
else:
self.result = None 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 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)

五、参考文献

使用案例GitHub源码:https://github.com/pyAppman/ChakraCore

本文主要讲下python调用ChakraCore.dll

参考文献有:https://xz.aliyun.com/t/2450 以及 https://bbs.125.la/forum.php?mod=viewthread&tid=14495171&highlight=ChakraCore

欢迎大家补充,没有太多的python文档借鉴,是自己一步一个脚印,爬坑爬出来的,好似盲人摸象。写的不好,还请轻喷。



python3调用微软js引擎ChakraCore的更多相关文章

  1. QML和JS引擎的关系以及调用c++函数的原理

    首先推荐几篇博客 1.深入解析QML引擎, 第1部分:QML文件加载 https://www.cnblogs.com/wzxNote/p/10569535.html 2.深入解析QML引擎, 第2部分 ...

  2. JS引擎是如何工作的?从调用堆栈到Promise

    摘要: 理解 JS 引擎运行原理. 作者:前端小智 原文:JS引擎:它们是如何工作的?从调用堆栈到Promise,需要知道的所有内容 Fundebug经授权转载,版权归原作者所有. 为了保证可读性,本 ...

  3. Js引擎解析执行 阅读笔记

    Js引擎解析执行 阅读笔记 一篇阅读笔记 http://km.oa.com/group/2178/articles/show/145691?kmref=search&from_page=1&a ...

  4. 深入浏览器工作原理和JS引擎(V8引擎为例)

    浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...

  5. 判断js引擎是javascriptCore或者v8

    来由   纯粹的无聊,一直在搜索JavaScriptCore和SpiderMonkey的一些信息,却无意中学习了如何在ios的UIWebView中判断其js解析引擎的方法: if (window.de ...

  6. 【repost】浏览器内核、渲染引擎、js引擎

    [1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具[2]常见引擎 渲染引擎: firef ...

  7. 浏览器内核、渲染引擎、js引擎

    [1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎: fire ...

  8. 【转】浏览器内核、渲染引擎、js引擎

    [1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具[2]常见引擎 渲染引擎: firef ...

  9. 在Android上使用Google V8 JS 引擎

    在cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高.后来测试发现在大部分 ...

随机推荐

  1. Django 学习 之路由层(URL)

    路由层(URL) 1.路由层简单配置 (1)path方法 写固定的url. (2)re_path方法 可以正则规则 例: urlpatterns = [ path('admin/', admin.si ...

  2. C语言结构体指针(指向结构体的指针)详解

    C语言结构体指针详解 一.前言 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组. *a).b 等价于 a->b. "."一 ...

  3. python之常见模块(time,datetime,random,os,sys,json,pickle)

    目录 time 为什么要有time模块,time模块有什么用?(自己总结) 1. 记录某一项操作的时间 2. 让某一块代码逻辑延迟执行 时间的形式 时间戳形式 格式化时间 结构化时间 时间转化 总结: ...

  4. 二 SSH整合:Spring整合Hibernate,无障碍整合&无核心配置整合,Hibernate模版常用方法,

    重建SSH项目 java项目可以直接复制,但是web项目除了改名字还要该配置,如下: 方式一:无障碍整合:带Hibernate配置文件 <?xml version="1.0" ...

  5. nodejs,webpack安装以及初步运用

    nodejs安装: 1.下载:https://nodejs.org/en/download/ 2.安装node-v6.11.3-x64.msi文件,直接默认安装(next……): 3.验证是否完成安装 ...

  6. 多选按钮CheckBox

    main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  7. Linux安装nginx的环境要求

    # Linux下切记不能乱删东西!我把pcre强制删除后,什么命令都不能使用了,系统奔溃,血的教训! nginx是C语言开发,建议在linux上运行,本教程使用Centos6.4作为安装环境. 一.  ...

  8. 嵊州普及Day3T1

    题意:n座山,每天袭击k面,不能为同一座.问最少几天袭击所有山两面. 思路:不管如何,n,k<=10,做了就能过,考试时先想的暴力模拟,后来发现有规律,看看就好了. 见代码: #include& ...

  9. poj1861 network(并查集+kruskal最小生成树

    题目地址:http://poj.org/problem?id=1861 题意:输入点数n和边数n,m组边(点a,点b,a到b的权值).要求单条边权值的最大值最小,其他无所谓(所以多解:(.输出单条边最 ...

  10. 密码学概述&置换密码

    密码学 概述 如何将信息进行加密,传送到接收方,接收方在进行解密获取信息,中间即使有窃听者窃听到信息也可解密破解. 密码学分类 密码编辑学(保密) 密码分析学(破译) 该破译与传统的黑客技术有一定的区 ...