前言
在使用python写爬虫时,有时需要逆向,解密,需要运行js代码,需要和python进行交互,在python中可以使用 PyExecJS
或 js2py
,但是这两个只适合简单的js代码片段,有局限性,不如直接使用 subprocess
调用 node.js
安装node.js
下载完后,改一下安装位置,其余全部下一步安装即可
subprocess运行js
subprocess
基本原理
subprocess
是Python的标准库,subprocess
模块允许 Python 启动新进程、连接到它们的输入 / 输出 / 错误管道,并获取返回码。核心函数是 subprocess.run()
(Python 3.5+),简化了旧版 subprocess.Popen
的使用。
执行js-subprocess.run()
代码
### demo.js
function test(a,b,c) {
return a+b+c
};
# 接受subprocess传来的参数
arg1 = process.argv.slice(2)[0]
arg2 = process.argv.slice(2)[1]
arg3 = process.argv.slice(2)[2]
console.log(test(arg1, arg2, arg3))
### main.py
import subprocess
arg1 = 'python'
arg2 = '调用'
arg3 = 'js'
js_result = subprocess.run(['node', 'demo.js', arg1, arg2, arg3],capture_output=True,text=True,encoding='utf8')
# 手动判断退出码
if js_result.returncode == 0:
print("标准输出:\n" ,js_result.stdout)
else:
print("错误输出:\n", js_result.stderr)
### 运行结果
标准输出:
python调用js
方法详解
-
['node', 'demo.js', 'arg1', 'arg2', 'args3']
: 命令和参数的列表。node
是命令,可以传node(会在系统变量中寻找node.exe),也可以传node.exe的所在路径,demo.js
是要执行的文件,arg1
,arg2
,arg3
是传递给 JS 脚本的参数,命令和参数的类型必须是字符串,否则报错。 -
capture_output=True
: 捕获子进程的标准输出 (stdout
) 和标准错误 (stderr
)。而不是出错直接在控制台输出 -
text=True
: 将捕获的输出从字节(bytes)解码为字符串(str) -
check
:True
:若子进程返回非零退出码(表示错误),自动抛出CalledProcessError
异常。False
(默认):不检查退出码,需手动判断result.returncode
。
-
timeout
:设置超时时间(秒),超时后终止子进程并抛出异常。 -
input
:传递给子进程的输入内容(需配合text=True
使用字符串,否则用bytes
)。
评论