使用PyV8在Python中加载JavaScript库

时间:2014-04-16 03:29:33

标签: javascript python gps gis pyv8

我试图在我的Python代码中使用leaflet.js库的一些功能。并且为了在代码中执行JS命令,我正在使用PyV8。但我无法将leaflet.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库?

1 个答案:

答案 0 :(得分:3)

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

编辑:看起来有一种方法,显然传单在没有DOM的情况下仍然有用 - 首先必须在某种程度上重新创建DOM,正如这位好人在这里展示的那样:https://github.com/rclark/server-side-leaflet。注意:不确定这是否与PyV8一起使用,你只需要尝试。

Edit2:在前一点上稍微扩展一下:你使用PyV8得到的是一个纯粹的非基于浏览器的javascript运行时环境。它不知道'窗口'或'文档'是什么,因为V8不关心UI。 Leaflet需要DOM来运行,因此它需要“思考”它存在于浏览器中。 rclark的服务器端传单需要node.js特定扩展,因此它在PyV8中不起作用。

这个javascript DOM实现可能在PyV8中工作:https://github.com/andreasgal/dom.js/。您必须以正确的顺序将所有提供的js源加载到PyV8中 - 请注意,此库仅提供spidermonkey的说明,而不是V8。即为了做到这一点,这将是棘手的。

所以,正如我所看到的,你有以下选择(按照增加的复杂性和/或技能要求):

  1. 有人在下面的帖子中显然解决了python的这个问题,但显然使用了一些使用OTR的矩形近似 - 在评论中看到他接受的答案的github链接。我会检查一下,然后判断近似值是否足够好。 Lookup country for GPS coordinates without Internet access
  2. 切换到基于浏览器的环境并直接使用传单。
  3. 切换到node.js并使用rclark的端口。
  4. 尝试以某种方式将一个DOM放入PyV8,可能使用andreasgal,然后从那里使用传单。
  5. 根据您的需要调整传单,使其不再具有任何DOM依赖关系(首先使用窗口和/或文档屏蔽任何内容,如if (typeof(window) === 'object' && window !== null){...}。如果您使用此工作,我会制作一个请求传单项目,因为许多其他人可能会从您的工作中获益。