python执行调用js文件的几种方式与问题

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

你可能感兴趣的:(js基础,javascript,前端,开发语言)