下面是完整的工作代码,我唯一用\\not working
注释的地方是我面临问题的地方
这是在nodejs脚本中使用spawn进程的一般查询,我在nodejs脚本的forloop中创建并执行spawn进程。forloop有一个元素列表,在每个循环中,该列表将元素发送给python脚本,python脚本使用该元素执行一些操作并返回结果
我正在做的是将结果保存在nodejs脚本内的javascript数组中(但这不会执行)。而之前我能够显示返回的结果
我想为每个元素创建spawn进程,然后将其保存在javascript数组中,而不是显示python脚本的返回值
Nodejs代码供参考,其中包含for循环,请参见output_array = []
我想在此输出数组中保存for循环的每个元素的生成结果
const express = require("express"),
app = express();
var server = http.createServer(app);
const port = process.env.PORT || 3000
// Creates a server which runs on port 3000 and
// can be accessed through localhost:3000
app.listen(port, () => {
console.log(`server running on port at ${port}`);
})
app.get('/', function(req, res){
res.sendFile(path.join(__dirname,'index.html'));
});
app.post('/getscorelist', getscorelist);
function getscorelist(req, res){
csvData = req.files.csvfile.data.toString('utf8');
csvData = csvData.split(/\r\n/)
output_array = []
for (var i=1;i<csvData.length;i++){
console.log(csvData[i])
// Send request to python script
var spawn = require('child_process').spawn;
var process = spawn('python', ["-u", "./test.py", csvData[i].trim()])
process.stdout.on('data', function(data){
// Not working
res.send("<p>"+data.toString()+"</p>")
});
}
}
上面代码的控制台输出如附件所示,您可以看到打印了5个相同的标题,我认为这只和csv文件的第一个数字有关。它应该是不同的字符串,因为数字不同
将csv文件数据发送到nodejs脚本的HTML代码。另外,我之前在这个html文件中为ajax编写了代码,用于将此请求发送到NodeJSAPI,并在csv文件中获得结果,然后生成链接,允许用户下载结果。为此,我制作了一个div标签<div id="linkforoutput"></div>
<div class="multidiv">
<form method="POST" enctype="multipart/form-data" action="/getscorelist">
<p for="">Please upload csv file (having list of patent numbers):
<br>
<input type="file" style="cursor: pointer;" name="csvfile" id="csvfile" accept=".csv"></p><br><br>
<button type="submit" id="submit_button" style="cursor: pointer;">Submit</button><br><br>
</form>
<div id="linkforoutput"></div>
</div>
下面是nodejs脚本中for循环的csv文件或元素
patent
9015616
9015617
9015618
9015699
7843093
让我们来看一下mainfile.py
是python文件,其执行如下
import requests
import sys
from bs4 import BeautifulSoup
import re
patent_number = sys.argv[1]
patent_number = patent_number.strip()
ur = "https://patents.google.com/patent/US"+str(patent_number)
ur = "https://patents.google.com/patent/US9015699"
headers = requests.utils.default_headers()
headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
})
content = requests.get(ur, headers=headers)
soup = BeautifulSoup(content.text,'html.parser')
strin = soup.title.get_text().split("-")[1]
strin = strin.strip()
print(strin)
我正在尝试的是如下所示,我能够获得console.log(csvData[i])
的控制台输出,但无法获得console.log(data.toString())
的输出
app.post('/getscorelist', getscorelist);
function getscorelist(req, res){
csvData = req.files.csvfile.data.toString('utf8');
csvData = csvData.split(/\r\n/)
output_array = []
for (var i=1;i<csvData.length;i = i+1){
console.log(csvData[i])
// Send request to python script
var spawn = require('child_process').spawn;
var process = spawn('python', ["-u", "./test.py", csvData[i].trim()])
process.stdout.on('data', function(data){
console.log(data.toString())
// data_csv_string = data.toString()
// var strin = data_csv_string.trim()
// strin = strin.replace(/(\r)/gm, "");
// output_array.push(strin)
// res.send(200)
});
}
}
我认为解决这个问题的更干净的方法是使用ZeroMQ等公司提供的请求-响应/RPC模式,您可以使用它与基于python的beautifulsoup服务通信express.js服务器。在我看来,其结果将是更加模块化和可重用。pythonvirtualenv的管理将保持独立。否则,将很难管理和触发正确的解释器和相关的环境变量
以下是一些链接:
例如,以下是ZeroMQ官方指南中node.js中RPC客户端的代码片段:
下面是python中相应的服务器:
我认为上面的例子也可以修改以适应当前的问题
相关问题 更多 >
编程相关推荐