execjs 运行结果和 nodejs 结果不一样的解决方法

写作背景

上一篇博客 我写了百度翻译反爬的解决方法,后来使用的过程中出了问题,我用 nodejs 调试 js 文件的时候输出的结果和在浏览器命令行运行的结果一样,可是使用 execjs 调用的时候输出的结果是错的,如下图。

  • 使用 nodejs 运行结果。
    在这里插入图片描述
  • 使用 execjs 调用的结果
    在这里插入图片描述
    生成的结果 不一样!!! ,好气,但是也没有什么解决办法。
    可是后来,我有了思路。

可能出现问题的原因

我不管怎么尝试都是不行,所以就去群里问大佬是什么情况,有个大佬提出了他的看法,我觉得很有道理,他说:execjs 没有 nodejs 好,有些位运算会有问题 ,如果要看的话,那个函数里确实有 位运算 的部分,所以我觉得这个原因应该是合理的(主要是我也没研究过这俩的源码つ﹏⊂)。
既然有原因了,那也就好解决了。

思路讲解

在经历一段时间的冥思苦想后,我恍然大悟,nodejs 可以在 命令行 运行。尝试一下。
在这里插入图片描述
还真的可以!

这时候你可能会问:小菜鸡,这个有啥用呢?

  • 既然你诚心诚意的发问了,我就大发慈悲的告诉你(中二一下,嘿嘿(●ˇ∀ˇ●))

可以在命令行运行的话,我可以使用 os 库在命令行调用 nodejs ,运行 js 文件,然后 获得运行结果 。所以解决思路也是这样。

第一步 执行 js 文件

nodejs 运行 js 文件的命令是

【nodejs路径】\node.exe 【js 文件路径】

eg:

D:\node.exe test.js
  • 要这样使用的话有个 前提 ,那就是 — 安装 nodejs 呀😄!没有它一切都是瞎扯。
  • 安装的话直接百度即可。

第二步 执行 js 命令时传参

上一步我是把一个参数 直接写入了 js 文件,但实际应用的过程中我们是要 根据自己的需要传递参数 ,这就涉及到另一个知识点 — nodejs 执行 js 文件时传递参数

  • nodejs 执行 js 文件传递参数的命令格式如下:
    【nodejs路径】\node.exe 【js 文件路径】 【要传递的参数,用空格分隔】
    

还有个问题,我们怎么 在 js 文件中获得命令行传递的参数 呢?这就要使用命令:process.argv.splice(2)

process.argv 属性返回 数组,其中包含启动 Node.js 进程时传入的命令行参数。

  • 第一个元素将是 process.execPath。 如果需要访问 argv[0] 的原始值,请参阅 process.argv0。
  • 第二个元素将是正在执行的 JavaScript 文件的路径。 其余元素将是任何其他命令行参数

也就是说,我们传递的参数就在 process.argv 这个 列表 中。

js 中取出列表元素的函数是 splice ,使用方法(详情请见 菜鸟教程)如下:

array.splice(index,howmany,item1,.....,itemX)
参数说明
index必需。规定从何处添加/删除元素。该参数是开始插入和(或)删除的数组元素的下标,必须是数字。
howmany可选。规定应该删除多少元素。必须是数字,但可以是 “0”。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
item1, …, itemX可选。要添加到数组的新元素。

splice(2) 就是取出了 传递的参数

尝试一下:

var arguments = process.argv;
console.log('数组数据:', arguments)
console.log('所传递的参数是:', arguments.splice(2));

在这里插入图片描述在这里插入图片描述可以看到,我们得到了传递的参数,但是返回值是 列表,要将其 变成字符串,可以 直接取出元素,也可以 使用 join 函数(我用的这种)。

js 文件修改为:

var arguments = process.argv.splice(2).join('');
console.log('所传递的参数是:', arguments);

// pass

console.log(e(arguments))

第三步 命令行执行命令

js 部分已经准备完毕,下面就是使用 python 获得执行结果。

python 执行方法就是调用函数 os.system()

import os
os.system('【nodejs路径】\node.exe 【js 文件路径】')

在这里插入图片描述
是正确结果,nice!!!

第四步 获取结果

os.system()直接将结果输出到命令行 ,那我们怎么获得运行结果呢?这就要用到 os 库中的函数:popen

看一下 菜鸟文档中对 popen 的介绍

概述

os.popen() 方法用于从一个命令打开一个管道。
在Unix,Windows中有效

语法

popen()方法语法格式如下:
os.popen(command[, mode[, bufsize]])

参数
  • command – 使用的命令。
  • mode – 模式权限可以是 ‘r’(默认) 或 ‘w’。
  • bufsize – 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值
返回值

返回一个文件描述符号为fd的打开的文件对象

返回值是 可打开的文件对象 ,类似于我们使用 open 函数返回的文件对象,可以使用 readlines() 等函数读取内容。

代码如下:

import os
kw = '【要翻译的内容】'
print(os.popen(f'【nodejs路径】\node.exe 【js 文件路径】 "{kw}"').readlines())

在这里插入图片描述
成功完成任务!!!




结尾

有想要一起学习 python 的小伙伴可以 私信我 进群哦。

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值