python使用execjs執行js


python 執行js代碼

簡單調用

import execjs

execjs.eval("new Date")
返回值為: 2018-04-04T12:53:17.759Z
execjs.eval("Date.now()")
返回值為:1522847001080  # 需要注意的是返回值是13位, 區別於python的time.time()

需要注意的是: 個別的JS語句, 用execjs返回的結果跟瀏覽器環境返回的結果是有區別的, 以下是瀏覽器環境返回的結果

 

 

調用函數

import execjs
ctx = execjs.compile("""
       function add(x, y) {
               return x + y;
          }
""") # 獲取代碼編譯完成后的對象
print(ctx.call("add", 1, 2)) # 3 
# print(ctx.eval("add({0},{1})").format(1,2)) # 報錯
print(ctx.eval('add("{0}", "{1}")').format("1","2")) # 12

文件讀取代碼編寫

創建jsCode.js的文件

function add(x, y) {
    return x + y;
}

執行代碼

import execjs
file = 'jsCode.js'
ctx = execjs.compile(open(file).read())
js = 'add("{0}", "{1}")'.format("1","2")
params = ctx.eval(js)
print(params) # 12
params = ctx.call('add',1,2)
print(params) # 3

出現錯誤提示

UnicodeEncodeError: 'gbk' codec can't encode character xxx

解決方案一    

添加          encoding="utf-8"

ctx = execjs.compile(open(file,encoding="utf-8").read())

解決方案二

js文件以GBk方式保存

 

 

 

執行JS的環境

在windows上不需要其他的依賴便可運行execjs, 也可以調用其他的JS環境

windows 默認的執行JS的環境
execjs.get().name
返回值: JScript

作者本人的windows上裝有Node.js , 所以返回值不同
execjs.get().name
返回值: Node.js (V8)

在ubuntu下需要安裝執行JS環境依賴, 環境為PhantomJS

execjs.get().name
返回值: PhantomJS

源碼中給出, 可執行execjs的環境:

  PyV8           = "PyV8"
  Node           = "Node"
  JavaScriptCore = "JavaScriptCore"
  SpiderMonkey   = "SpiderMonkey"
  JScript        = "JScript"
  PhantomJS      = "PhantomJS"
  SlimerJS       = "SlimerJS"
  Nashorn        = "Nashorn"

在ubuntu環境下, 沒有JS環境會報錯:Could not find an available JavaScript runtime. 由此可見, execjs在ubuntu需要安裝JS環境 。具體的JS環境需根據具體的需求安裝, 切不可超過以上8種。

python2執行執行js文件使用pyv8

環境切換

通過os.environ

os.environ["EXECJS_RUNTIME"] = "Node"
execjs.get().name
execjs.eval("1 + 2")

通過execjs.get 切換

jscript = execjs.get(execjs.runtime_names.JScript)  # runtime_names 便是execjs源碼中給出的執行環境的。 execjs.runtime_names.xxx  xxx必須在上一節 #3中取
jscript.eval("1 + 2")

注: 在切換環境時, 當環境不存在不會報錯, 會使用默認的環境。 另外需要注意的是, 兩種方式的區別

簡易性能分析

 # 只簡單試了三種, 在windows下
import  execjs
import os
import time

# 先用JScript
os.environ["EXECJS_RUNTIME"] = "JScript"
print execjs.get().name

time1 = time.time()
for i in range(100):
    execjs.eval("new Date")
print time.time() - time1

# 切換環境 使用Nodejs
os.environ["EXECJS_RUNTIME"] = "Node"
print execjs.get().name

time2 = time.time()
for l in range(100):
    execjs.eval("new Date"print time.time() - time2

# 打印的結果為:
JScript
4.70900011063
Node.js (V8)
27.501999855

# 在ubuntu下試的是PhantoJS , 結果竟然高達 30+ S

此注釋來自execjs作者:PyExecJS的缺點之一就是性能。PyExecJS通過文本傳遞JavaScript運行時,並且速度很慢。另一個缺點是它不完全支持運行時特定的功能。對於某些用例,PyV8可能是更好的選擇。

總注:使用execjs的難點並不是在execjs這個庫, 而是解析JS的過程, 因為沒有瀏覽器的環境, 沒有加密源碼的依賴。從成千上萬行的JS中擇出想要的內容,可能是一段孤零零的JS函數,也可能是從幾個JS文件去找出各自找出一段JS代碼, 並可以通過execjs順利執行, 這並非易事。 需要慢慢積累經驗。 一旦掌握, 便可以提高爬蟲的效率, 以及代碼的健壯性, 節省資源!

 

 

 

 小編在運行是遇見個問題

execjs._exceptions.ProgramError:SyntaxError

execjs._exceptions.ProgramError:SyntaxError

運行 print(execjs.get().name)

print(execjs.get().name)

發現

終端和解釋器的返回值不一樣

解釋器的結果為: JScript
終端的結果為:Node.js (V8)

一直報這個問題

懷疑是否和node的版本有關

於是升級到了最新版依然沒用

然后又猜想是否和用戶的權限有關

於是用管理員的權限運行pycharm64.exe

 

 

 發現這下解釋器的結果為:Node.js (V8)

 

 

 這下發現原因了原來是每次打開pycharm的用戶權限不夠

 

這下重啟pycharm問題解決了, 開心

 

如果你覺得以上方法覺得麻煩的話點擊下面這個鏈接

https://www.cnblogs.com/shizhengwen/p/14096520.html

里面有python 調用 js 不用安裝nodejs就能用的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM