【Python & Js】Python执行 Js代码的几种方法
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
前言
使用 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
安装成功后,导入模块。
- 输入
execjs.get().name
, - 输出的是
Node.js (V8)
,则表示OK了。 - 如有安装有遇到问题,可以参考 【Python爬虫 Js逆向】简单案例 +环境配置。
代码
这里 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.js 的 Express 模块,
- 在cmd窗口 输入 npm install express;(npm为Node.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服务,使用内网穿透,还可以给到其他人访问。
后话
本次的分享到此结束,
如有疑问,请自行解决。
相关文章
- Python socket(TCP阻塞模式)基础程式
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
- python删除、替换字符串某字符后的字符串(删除字符串、替换字符串、strip、split、rstrip、lstrip、replace)
- 30岁一无所长,转行做什么?我为什么会选择python?
- python & shell实现业务高峰期临时动态增加服务器
- 学习Python的第八节课(文本文件、二进制文件、文件格式转换)
- 【Python】【Appium】截图 对指定元素(element)截图 PIL&Pillow
- Python 的打包神器 — Nuitka
- python学习笔记之module && package
- 《贝叶斯思维:统计建模的Python学习法》一1.6 M&M豆问题
- 基于Python实现函数绘图语言解释器【100010254】
- (数据科学学习手札20)主成分分析原理推导&Python自编函数实现
- python django bootstrap_导入 201901
- VSCode中Python格式设置
- Python之文件读取、写入和异常处理操作举例
- 2022&2023华为OD机试 - 二叉树层次遍历(Python)
- 2022&2023华为OD机试 - 斗地主 2(Python)
- 2022&2023华为OD机试 - 星际篮球争霸赛(Python)
- 学生学python编程---实现贪吃蛇小游戏+原码
- Unity 基础 之 Unity 简单调用 Python (传递多个参数并接收返回值)
- 【历史上的今天】1 月 31 日:Python 之父出生;宏碁大战联想;SBC 收购 AT&T
- (5)python迭代器与生成器(generator & Iterator)
- 学习笔记(35):Python网络编程&并发编程-协程(yield,greenlet,gevent模块)
- 学习笔记(33):Python网络编程&并发编程-进程池线程池
- 学习笔记(29):Python网络编程&并发编程-信号量
- 学习笔记(28):Python网络编程&并发编程-死锁与递归锁
- 学习笔记(23):Python网络编程&并发编程-开启线程的两种方式
- 学习笔记(15):Python网络编程&并发编程-进程理论
- 学习笔记(07):Python网络编程&并发编程-客户端与服务端代码bug修复
- windows下面安装Python和pip终极教程
- np.zeros的问题&&python错误:TypeError: Cannot interpret ‘3‘ as a data type