在Python中使用PyV8加载JavaScript库

4 投票
1 回答
2665 浏览
提问于 2025-04-18 02:54

我正在尝试在我的Python代码中使用leaflet.js这个库的一些功能。为了在代码中执行JavaScript命令,我使用了PyV8。但是我无法在PyV8的环境中加载leaflet.js库。当我这样做时,

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

我甚至尝试在加载leaflet.js之前先加载jquery库,因为我想也许leaflet是依赖于它的。但结果我又遇到了这个错误,

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

有没有办法让我成功加载这个JavaScript库呢?

1 个回答

3

你只能使用那些不依赖于DOM的库,因为在服务器端显然是没有DOM的。一个可以普遍使用的库的例子是mustache.js。

补充一下:看起来有办法,似乎leaflet在没有DOM的情况下也能用——只需要先稍微重建一下DOM,就像这个好心人展示的那样:https://github.com/rclark/server-side-leaflet。注意:不确定这是否能和PyV8一起工作,你得自己试试。

再补充一点:用PyV8你得到的是一个纯粹的非浏览器的JavaScript运行环境。它对'window'或'document'这些概念一无所知,因为V8不关心用户界面。leaflet需要DOM来运行,所以它需要“认为”自己在浏览器里。rclark的服务器端leaflet需要node.js特定的扩展,所以在PyV8里是无法工作的。

有一个JavaScript DOM实现,可能在PyV8中有效:https://github.com/andreasgal/dom.js/。你需要按照正确的顺序将那里的所有JS源加载到PyV8中——注意这个库只提供了spidermonkey的说明,而不是V8。也就是说,这个过程会比较复杂。

所以,我认为你有以下几个选择(按复杂程度和所需技能从低到高排序):

  1. 似乎有人在下面的讨论中为Python解决了这个问题,但显然是使用了一些矩形近似的方法,使用OTR——可以查看他在接受答案评论中的GitHub链接。我建议你看看这个,判断一下这个近似是否足够好。在没有互联网的情况下查找GPS坐标的国家
  2. 切换到基于浏览器的环境,直接使用leaflet。
  3. 切换到node.js,并使用rclark的移植版本。
  4. 尝试以某种方式将DOM引入你的PyV8,可能使用andreasgal的库,然后从那里使用leaflet。
  5. 根据你的需求调整leaflet,使其不再依赖任何DOM(可以先用类似if (typeof(window) === 'object' && window !== null){...}的方式屏蔽任何使用window和/或document的代码。如果你能做到这一点,我建议你向leaflet项目提交一个合并请求,因为很多其他人可能会从你的工作中受益。

撰写回答