zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【Python & Js】Python执行 Js代码的几种方法

2023-09-27 14:26:45 时间

此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。

前言

使用 Python 执行 Js代码,相信这是个不少小伙伴都会遇到过。
本篇文章就来介绍以下三种 使用 Python 执行 Js 代码的方法。

  • os
  • execjs
  • nodejs-express

本片文章,有一个先决条件。那就是安装 Node.js,默认读者已完成该步骤。
如果你对安装 Node.js 有不了解之处,可以参考 Node.js的安装配置

以下,文章就正式开始了。


1. os

os模块Python 自带的一个操作系统接口模块,详见OS模块介绍。

在这里主要用到它的 os.popen 命令,

  • 官方文档对其释义如下图所示
    在这里插入图片描述

换一句话说就是,他会在命令行窗口帮助我们执行我们指定的命令。

代码

这里 Js代码文件 需要与 Python 文件 在同一目录下,否则需要补充路径

demo_os.js

function sum(num_1, num_2) {
    num_1 = parseInt(num_1);
    num_2 = parseInt(num_2);
    return num_1 + num_2;
}

// process.argv[2]指的是接收传递过的第二个参数
var num_1 = process.argv[2];
var num_2 = process.argv[3];
console.log(sum(num_1, num_2));

demo_os.py

import os

command = os.popen("node demo_os 10 100")
result = command.read().replace('\n', '')
command.close()  # 关闭Node.js
print(result)	# 110

动图示例:

在这里插入图片描述

2. execjs

有趣的是,安装时候是 PyExecJS,在Python中使用则是 execjs
并且!!!在执行比较大的Js代码时候,会很慢!!!适合小的Js代码

安装模块

pip install PyExecJS

安装成功后,导入模块。

代码

这里 Js代码文件 需要与 Python 文件 在同一目录下,否则需要补充路径

demo_execjs.js

function sum(num_1, num_2) {
    num_1 = parseInt(num_1);
    num_2 = parseInt(num_2);
    return num_1 + num_2;
}

demo_execjs.py

import execjs

with open('demo_execjs.js', 'r', encoding='utf-8') as f:
    content = f.read()

# compile 指编译Js代码、call值调用指定函数,后面跟的参数是传入的参数
result = execjs.compile(content).call('sum', 10, 100)
print(result)	# 110

动图示例:

在这里插入图片描述

3. nodejs-express

相对来说,这个的使用会麻烦一些,因为代码比较多。

这一步骤建议观看视频学习,文字能表达的很有限~

文字相对繁琐,可通过观看视频【Python爬虫 Js逆向】简单案例 +环境配置 进行学习。


首先你需要在安装 Node.jsExpress 模块,

  • cmd窗口 输入 npm install express;(npmNode.js安装模块的命令)
  • 它用于提供精简的基本 Web 应用程序功能;
  • 换句话说就是它搭建了一个 Web 服务,以供你访问并帮助你执行 Js代码
npm install express

代码

记得两个代码都要启动哦,先启动 js代码,再启动 python代码

先来一个简单示例,开启一个基本的 Web服务。

demo_nodejs.js

const express = require('express')		// 1	导入Express
const app = express()					// 2	建一个Express应用程序


app.get('/', function (req, res) {		// 3	定义get请求方法,路径为根
    console.log('hello world')			// 4	在控制台输出
    res.send('this is SunriseCai')		// 5	发送到请求端

})

app.listen(3000, () => {
    console.log('开启端口 要你命3000')	// 6	开启监听3000端口,通过127.0.0.1:3000访问
})

demo_nodejs.py

import requests

url = 'http://127.0.0.1:3000'
resp = requests.get(url)
print(resp.text)	# 110

动图示例:
在这里插入图片描述


再来一个接近实际案例的例子。
demo_nodejs_2.js

const express = require('express');
const app = express();                      // 1    建一个Express应用程序
var bodyParser = require('body-parser');    // 2   导入body-parser包
app.use(bodyParser());                      // 3   定义中间件的意思撒

function add(a, b) {
    return a + b
}

app.post('/get_sum', function (req, res) {    // 4   建立post请求,链接为get_num
    let resp = req.body;                      // 5   接受传过来的请求体
    let a = parseInt(resp.num_1);
    let b = parseInt(resp.num_2);           // 6   将字符串转为整型
    let result = add(a, b);                 // 7   调用add方法
    res.send(result.toString());            // 8   转换为字符串,发送到请求端
});

app.listen(3000, () => {                    // 9 开启监听3000端口
    console.log("开启服务,端口3000")
});

demo_nodejs_2.py

import requests

data = {
    'num_1': 10,
    'num_2': 100,
}
url = 'http://127.0.0.1:3000/get_sum'

resp = requests.post(url, data=data)
print(resp.text)	# 110

动图示例:
在这里插入图片描述

4. 总结

以上就是本次文章的所有内容了,
选择哪种方式去执行 Js代码,就任君选择啦。

我个人认为,
不管 Js代码 的大小,用 os 去调用 command 执行都足够了,
第三种方法用 Node.js 建立 Web服务,使用内网穿透,还可以给到其他人访问。

后话

本次的分享到此结束,
如有疑问,请自行解决。