小码农

好记性不如烂笔头....

一次一脸懵逼的js调用

有个爬虫项目需要调用js获取接口参数,具体分析过程略去,只说execjs调用js代码。

环境:

  • Python3.6
  • execjs
  • NodeJs
  • Windows

pip3 install PyExecJs

NodeJs直接官网下载msi包傻瓜式安装

import execjs
node = execjs.get(execjs.runtime_names.Node)

执行报错:execjs._exceptions.RuntimeUnavailableError: Node.js (V8) runtime is not available on this system

根据网上说的:重启Pycharm,结果还是报错

根据网上说的:添加环境变量,安装NodeJs的时候已经添加了

一顿搜索无果,看源码吧。。。。。打断点,一路跟踪到这个函数

def _find_executable(prog, pathext=("",)):
    """protected"""
    pathlist = _decode_if_not_text(os.environ.get('PATH', '')).split(os.pathsep)
    for dir in pathlist:
        for ext in pathext:
            filename = os.path.join(dir, prog + ext)
            try:
                st = os.stat(filename)
            except os.error:
                continue
            if stat.S_ISREG(st.st_mode) and (stat.S_IMODE(st.st_mode) & 0o111):
                return filename
    return None

根据DUBUG来看,pathlist是个List(从名字也能看出来,为啥我就取不出这么好的变量名?),里面存放的是环境变量PATH里的所有路径,我看了。。。。除了刚刚新加入的nodejs路径外,其他都在。。。。所以我猜测是因为没检测到nodejs的路径,所以才报这个错的。。。。我开始懵逼了,按道理我重启了Pycharm,应该不存在没加载环境变量的问题啊。。。我得出结论,得重启电脑!!!

解决办法:因为我电脑在运行重要东西,考虑到这个脚本只运行一次,所以我在函数里加了一句代码,如下:

def _find_executable(prog, pathext=("",)):
    """protected"""
    pathlist = _decode_if_not_text(os.environ.get('PATH', '')).split(os.pathsep)
    pathlist.append(r"D:\Program Files\nodejs")
    for dir in pathlist:
        for ext in pathext:
            filename = os.path.join(dir, prog + ext)
            try:
                st = os.stat(filename)
            except os.error:
                continue
            if stat.S_ISREG(st.st_mode) and (stat.S_IMODE(st.st_mode) & 0o111):
                return filename
    return None

不推荐修改源代码!!!!!!虽然我在用过之后改回来了。还是比较推荐重启电脑的。最后代码成功运行,也证明我的推理的正确的。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注