2

我正在使用该库在我的 Python 代码中运行一段 Javascript 代码js2py。它适用于抛出的各种 Javascript 代码并处理结果。但是当在 Javascript 中使用“require”关键字时遇到错误代码。下面是我的代码

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是一个用于解析通过 npm 安装的 JSON 的 javascript 库。

以下是我收到的错误

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

现在我对错误进行了一些调查,结果发现'require'是浏览器要求,而不是node.js. 事实证明,还有一个替代方法require.js可以解决这个问题。所以我去了他们的文档,但对如何在我的 Javascript 代码中定义require没有太多意义。另外我将 jsonata 作为参数传递给require which是一个.js文件。与示例中给出的函数声明相反,我如何使用require.js框架来处理 jsonata.js 文件?我对这个主题的理解可能有误,但我需要对此进行澄清?有有什么办法可以使这项工作?

注意:我在服务器端运行代码。

4

2 回答 2

2

请尝试最新的支持需要npm模块的Js2Py。您的代码的问题只是不支持require。请在导入js2py后添加此语句。

from js2py import require

请让我知道您的代码在添加后是否正常工作。

于 2018-03-07T12:46:48.923 回答
0

出于安全原因,require在 JS 上下文中默认不支持。您可以轻松启用它:

>>> context = js2py.EvalJs(enable_require=True)
>>> context.eval("require('esprima').parse('var a = 1')")

正如 Alekhya Satya 在他的回答中提到的,您也可以require直接导入并从 python 上下文中使用它。

于 2019-06-27T21:43:59.517 回答