我正在使用js2py
库在我的Python代码中运行一段Javascript代码。它适用于抛出的所有类型的Javascript代码并处理结果。但是当我遇到一个错误<在Javascript代码中使用了强大的&#39;要求&#39; 关键字。这是我的代码
import js2py
data = '''var jsonata = require('jsonata');
var data = {
example: [
{value: 4},
{value: 7},
{value: 13}
]
};
var expression = jsonata("$sum(example.value)");
var result = expression.evaluate(data);
console.log(result);
'''
data = js2py.eval_js(data)
print(data)
这里 jsonata 是一个javascript库,用于解析通过npm安装的JSON。
以下是我收到的错误
Traceback (most recent call last):
File "/home/souvik/PycharmProjects/ServiceHandler/Testjs.py", line 67, in <module>
data = js2py.eval_js(data)
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/evaljs.py", line 113, in eval_js
return e.eval(js)
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/evaljs.py", line 182, in eval
self.execute(code, use_compilation_plan=use_compilation_plan)
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/evaljs.py", line 177, in execute
exec(compiled, self._context)
File "<EvalJS snippet>", line 2, in <module>
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/base.py", line 899, in __call__
return self.call(self.GlobalObject, args)
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/base.py", line 1344, in call
return Js(self.code(*args))
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/host/jseval.py", line 42, in Eval
executor(py_code)
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/host/jseval.py", line 49, in executor
exec(code, globals())
File "<string>", line 2, in <module>
File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/base.py", line 1079, in get
raise MakeError('ReferenceError', '%s is not defined' % prop)
js2py.internals.simplex.JsException: ReferenceError: require is not defined
但是,当我将javascript代码放在一个文件中并从命令行运行时,它就可以了。
jstest.js
var jsonata = require("jsonata");
var data = {
example: [
{value: 4},
{value: 7},
{value: 13}
]
};
var expression = jsonata("$sum(example.value)");
var result = expression.evaluate(data);
console.log(result)
在命令行中
node jstest.js --> gives 25
现在我对错误进行了一些调查,结果是&#39;要求&#39; 是浏览器要求,不适用于node.js
。事实证明,有一种替代方法可以解决这个问题require.js
。所以我去了他们的文档,但是我不太清楚如何定义 require 我的Javascript代码。我也将jsonata作为参数传递给 require ,这是一个 .js 文件。如何使用require.js
框架来处理jsonata.js文件与示例中给出的函数声明相对吗?我对这个主题的理解可能是错的,但是我需要澄清一下这个问题吗?有什么方法可以使这个工作吗?
注意:我正在服务器端运行代码。
答案 0 :(得分:2)
请尝试支持npm模块的最新Js2Py。您的代码的问题只是不支持require。请在导入js2py后添加此语句。
from js2py import require
如果你的代码在新添加后工作正常,请告诉我。
答案 1 :(得分:0)
出于安全原因,JS上下文默认不支持require
。您可以轻松启用它:
>>> context = js2py.EvalJs(enable_require=True)
>>> context.eval("require('esprima').parse('var a = 1')")
正如Alekhya Satya在回答中提到的那样,您还可以直接导入require
并从python上下文中使用它。