使用PyV8在Python中加载JavaScript库

使用PyV8在Python中加载JavaScript库,javascript,python,gps,gis,pyv8,Javascript,Python,Gps,Gis,Pyv8,我正试图在Python代码中使用splayer.js库的一些功能。为了在代码中执行JS命令,我使用PyV8。但是我无法将传单.js库加载到PyV8上下文中。当我这样做的时候 ctxt.eval(open("leaflet.js").read()) 我得到一个错误: ReferenceError: window is not defined ( @ 9 : 68 ) -> of t.coords[c]&&(u[c]=t.coords[c]);this.fire("loc

我正试图在Python代码中使用splayer.js库的一些功能。为了在代码中执行JS命令,我使用PyV8。但是我无法将传单.js库加载到PyV8上下文中。当我这样做的时候

ctxt.eval(open("leaflet.js").read())
我得到一个错误:

ReferenceError: window is not defined (  @ 9 : 68 )  -> of t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,doc
我甚至试着加载jquery库,然后才想可能传单依赖于它。但我得到了错误

TypeError: Cannot read property 'defaultView' of undefined (  @ 2 : 68 )  -> :!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultVi

有什么方法可以成功加载JS库吗?

您只能使用不依赖于DOM的库,因为它显然在服务器端不可用。这种通用库的一个例子是mustache.js

编辑:看起来有一种方法,显然传单在没有DOM的情况下仍然是有用的-只需先重新创建DOM,正如这位好心人在这里所示:。注意:不确定这是否与PyV8一起工作,您只能尝试一下

Edit2:对上一点做一点扩展:PyV8提供的是一个纯粹的基于浏览器的javascript运行时环境。它不知道什么是“窗口”或“文档”,因为V8不关心UI。传单需要DOM来操作,所以它需要“思考”它存在于浏览器中。rclark的服务器端传单需要node.js特定的扩展,因此它在PyV8中无法工作

有一个javascript DOM实现可以在PyV8中工作:。您必须以正确的顺序将这里提供的所有js源代码加载到PyV8中——注意,这个库只提供spidermonkey的说明,而不是V8。也就是说,这将是一个棘手的问题

因此,在我看来,您有以下选择(按照增加复杂性和/或所需技能的顺序):

  • 显然有人在下面的线程中为python解决了这个问题,但显然使用了一些使用OTR的矩形近似值——请参见对已接受答案的评论中的github链接。我会检查一下,然后决定近似值是否足够好
  • 切换到基于浏览器的环境并直接使用传单
  • 切换到node.js并使用rclark的端口
  • 尝试以某种方式将DOM引入PyV8,可能使用andreasgal,然后从那里使用传单
  • 根据您的需要调整传单,使其不再具有任何DOM依赖关系(首先使用窗口和/或文档屏蔽任何内容,如
    if(typeof(window)==='object'&&window!==null){…}
    。如果你能成功,我会向传单项目提出请求,因为其他人可能会从你的工作中获益

  • 请你说清楚一点好吗?这是不是意味着我不能加载传单.js,或者有办法吗?好吧,把我当作是任何web开发的新手。我只知道基本js和他的说明的问题对我来说没有意义。所以你能详细说明一下吗?对不起,我已经仔细研究了服务器端github-它和它的依赖dency、jsdom需要node.js,因此它们与PyV8不兼容。在下面的so线程中,它们链接到另一个js DOM实现,您可以尝试与传单一起使用:。但我担心这不会是一个轻松的过程,特别是如果您没有可靠的web开发经验。如果我是您,我会寻找Python-n很遗憾,这么多JS库的开发都依赖于DOM,即使在没有必要的情况下——这就是为什么服务器端javascript仍然不是一个很好的生态系统的主要原因。顺便说一句。另一种可能是,如果你不一定要使用Python,就切换到Node.JS。我不得不说PyV8本身不是很稳定,所以我只在真正需要的时候才使用它。