在for循环内部生成子进程

2024-10-01 22:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是完整的工作代码,我唯一用\\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文件的第一个数字有关。它应该是不同的字符串,因为数字不同

enter image description here

将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)

        });

        
    }
}


Tags: csvdiv脚本app元素fordatavar
1条回答
网友
1楼 · 发布于 2024-10-01 22:31:12

我认为解决这个问题的更干净的方法是使用ZeroMQ等公司提供的请求-响应/RPC模式,您可以使用它与基于python的beautifulsoup服务通信express.js服务器。在我看来,其结果将是更加模块化和可重用。pythonvirtualenv的管理将保持独立。否则,将很难管理和触发正确的解释器和相关的环境变量

以下是一些链接:

例如,以下是ZeroMQ官方指南中node.js中RPC客户端的代码片段:

// Hello World client
// Connects REQ socket to tcp://localhost:5555
// Sends "Hello" to server.

var zmq = require('zeromq');

// socket to talk to server
console.log("Connecting to hello world server...");
var requester = zmq.socket('req');

var x = 0;
requester.on("message", function(reply) {
  console.log("Received reply", x, ": [", reply.toString(), ']');
  x += 1;
  if (x === 10) {
    requester.close();
    process.exit(0);
  }
});

requester.connect("tcp://localhost:5555");

for (var i = 0; i < 10; i++) {
  console.log("Sending request", i, '...');
  requester.send("Hello");
}

process.on('SIGINT', function() {
  requester.close();
});

下面是python中相应的服务器:

#
#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects b"Hello" from client, replies with b"World"
#

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    #  Do some 'work'
    time.sleep(1)

    #  Send reply back to client
    socket.send(b"World")

我认为上面的例子也可以修改以适应当前的问题

相关问题 更多 >

    热门问题