先说成功的示例:
js部分:
function add(x, y) {
return x + y
}
.py文件调用js
import execjs
# 运行环境
print(execjs.get().name)
# 返回值:Node.js(V8)
# 简单示例:
with open('add.js') as file:
js_function = file.read()
ctx = execjs.compile(js_function)
x = 2
y = 8
print(ctx.call('add', x, y))
# 成功返回:10
出错的代码:
function _linik(params) {
let dCode = atob(params);
return decodeURI(dCode)
}
let params = 'aHR0cHM6Ly9kb3dubG9h'
console.log(_linik(params))
如果是直接运行上面这个js文件是成功执行的
但是如果用py文件调用就出错
调用出错的完整代码为:
js部分:
function _linik(params) {
let dCode = atob(params);
return decodeURI(dCode)
}
py部分:
import execjs
params = 'aHR0cHM6Ly9kb3dubG9h'
with open('get_link.js') as file:
jscode = file.read()
ctx = execjs.compile(jscode)
ctx.call('_linik', params)
经过打印发现 就是这个call报错了
以下是报错内容:
Node.js (V8)
10
function _linik(params) {
let dCode = atob(params);
return decodeURI(dCode)
}
let params = 'aHR0cHM6Ly9kb3dubG9hZC1wcm8uY2pqZDIwLmNvbS8xMjMtNTU3LzY1M2UzMWQxLzE2NzU3MzItMC82NTNlMzFkMThiNjAwNjI3YjVkN2IxNTMzM2U3ODIyZD92PTImdD0xNjc0MjA2NjI5JnM9ZjkxMzU2NjVlMGM4ZWE5NGVhMTEzNTVjMzg3ZWI1ZjYmZmlsZW5hbWU9V2luJUU3JTg5JTg4K1BTKzIwMjIucmFy'
console.log(_linik(params))
<execjs._external_runtime.ExternalRuntime.Context object at 0x000002D8552B92D0>
Exception in thread Thread-3 (_readerthread):
Traceback (most recent call last):
File "D:\Program Files\Python\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
self.run()
File "D:\Program Files\Python\Python311\Lib\threading.py", line 975, in run
self._target(*self._args, **self._kwargs)
File "D:\Program Files\Python\Python311\Lib\subprocess.py", line 1552, in _readerthread
buffer.append(fh.read())
^^^^^^^^^
UnicodeDecodeError: 'gbk' codec can't decode byte 0x88 in position 158: illegal multibyte sequence
Traceback (most recent call last):
File "D:\farml\PycharmProjects\django_farmllar\Apps\BaiduYunPan\tests.py", line 40, in <module>
ctx.call('linik', params)
File "D:\farml\PycharmProjects\venv\Lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in call
return self._call(name, *args)
^^^^^^^^^^^^^^^^^^^^^^^
File "D:\farml\PycharmProjects\venv\Lib\site-packages\execjs\_external_runtime.py", line 92, in _call
return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\farml\PycharmProjects\venv\Lib\site-packages\execjs\_external_runtime.py", line 78, in _eval
return self.exec_(code)
^^^^^^^^^^^^^^^^
File "D:\farml\PycharmProjects\venv\Lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_
return self._exec_(source)
^^^^^^^^^^^^^^^^^^^
File "D:\farml\PycharmProjects\venv\Lib\site-packages\execjs\_external_runtime.py", line 88, in _exec_
return self._extract_result(output)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\farml\PycharmProjects\venv\Lib\site-packages\execjs\_external_runtime.py", line 156, in _extract_result
output = output.replace("\r\n", "\n").replace("\r", "\n")
^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'replace'