1:execjs
import execjs def getpwd_(val1,val2): with open(r"./douyin.js", encoding="utf-8") as f: ctx = execjs.compile(f.read()) jiami= ctx.call('get_m', val1, val2) return jiami
常见问题:报错编码gkb不正确。
解决的话点击报错的位置的上一行,也就是\Python3.6\lib\subprocess.py的文件encoding处,将编码改为utf-8
def __init__(self, args, bufsize=-1, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=True,
shell=False, cwd=None, env=None, universal_newlines=None,
startupinfo=None, creationflags=0,
restore_signals=True, start_new_session=False,
pass_fds=(), *, encoding="utf-8", errors=None, text=None):
"""Create new Popen instance."""
_cleanup()
2:py_mini_racer 库的MiniRacer包
from py_mini_racer import MiniRacer
这个包是一个纯净的v8环境,没用node的环境,使用方式与execjs类似;
def get_pwd(valu1): ctx = MiniRacer() with open('text.js', mode='r', encoding='utf-8') as f: code = f.read() ctx.eval(code) jiami = ctx.call("getpwd",valu1) return jiami
.call后面第一个是js中要运行返回值的方法名字,后面的话是需要传入的值,也可以修改code的字符来达到传值的的目的。
3.node_vm2的沙箱
from node_vm2 import VM def getpwd(val1,): with open('text.js', mode='r', encoding='utf-8') as f: code = f.read() with VM() as vm: vm.run(code) jiami = vm.call('getpwd',val1) jiami2 =vm.run('getpwd()') print(jiami2) return jiami
运行方法也是类似,不过有时候也会与execjs一样,报错编码问题,解决方案是将encoding ='utf-8'删掉。要删的源文件是 Python lib site-packages node