मैंने नियंत्रक निर्देशिका में स्थित प्रोग्राम python-shell.js बनाया है। यह प्रोग्राम कुछ डेटा देता है।

अजगर-खोल.जेएस: कोड:

 var myPythonScriptPath = 'script.py';

// Use python shell
    const {PythonShell} = require("python-shell");
    var pyshell = new PythonShell(myPythonScriptPath);

    module = pyshell.on('message', function (message) {
    // received a message sent from the Python script (a simple "print" statement)
        console.log(message);
    });

    // end the input stream and allow the process to exit
    pyshell.end(function (err) {
    if (err){
        throw err;
    };

    console.log('finished');
    });

मैंने नियंत्रक निर्देशिका के बाहर एक और सर्वर.जेएस फ़ाइल बनाई। यह python-shell.js फ़ाइल को चलाना है।

सर्वर.जेएस: कोड

var app = express();
var path = require('path');

app.use(express.static(path.join(__dirname, 'Controllers')));

app.get('/', function(req,res){
    res.sendFile(__dirname + '/Controllers');
});
app.listen(3000,function() {
console.log('Listening');
})

लेकिन यह सर्वर.जेएस कोड मुझे वह कोड देता है जो मैंने "पायथन-शेल.जेएस" फाइल में लिखा था। लेकिन मैं चाहता हूं कि सर्वर.जेएस वह डेटा दे जो "पायथन-शेल.जेएस" देता है जब कोड देने के बजाय स्वतंत्र रूप से चलाया जाता है।

0
Ajax 13 जिंदा 2020, 15:19

1 उत्तर

सबसे बढ़िया उत्तर

जैसे कि मैं समझ गया। जब आपके सर्वर पर कोई अनुरोध आता है, तो आप केवल सादा पाठ स्रोत फ़ाइलों को परोसने के बजाय, एक पायथन मॉड्यूल से डेटा प्राप्त करना चाहेंगे।

जैसा कि आप देख सकते हैं कि लाइन res.sendFile(__dirname + '/Controllers'); फ़ाइल को स्वयं भेज देगी, यह इसे निष्पादित नहीं करेगी और आपकी फ़ाइल जो भी कंसोल पर भेजी जाएगी, प्रदान नहीं करेगी।

जो मैंने पहले कहा था उसे प्राप्त करने के लिए आपको अपनी JS फ़ाइल आयात करने की आवश्यकता होगी (सामान्य में इसे मॉड्यूल की आवश्यकता कहा जाता है), और फिर वहां से अपना डेटा प्राप्त करने के लिए फ़ंक्शन को कॉल करें (यदि आप सर्वर लॉजिक को पायथन शेल लॉजिक से अलग करना चाहते हैं)।

Python-shell.js के अंदर आपको app.get('/', function(req, res) {}) कॉलबैक के हिस्से के रूप में प्रदान की गई रेस ऑब्जेक्ट को पकड़ना होगा। तो मैं निम्नलिखित तरीके से कोड का पुनर्गठन करूंगा:

अजगर-खोल.जेएस

// Note that script.py refers to /script.py, not /Controllers/script.py
// As code bellow won't be called from within python-shell.js. More on that later
const myPythonScriptPath = 'script.py';

// Use python shell
const { PythonShell } = require("python-shell");

// From this file (module) we are exporting function 
// that takes req and res parameters provided by app.get callback
// Note that this file is not executed by itself, it only exposes
// a single function to whom is gonna import it
module.exports = function (req, res) {
    const pyshell = new PythonShell(myPythonScriptPath);

    // Create buffer to hold all the data produced 
    // by the python module in it's lifecycle
    let buffer = "";

    module = pyshell.on('message', function (message) {
        // received a message sent from the Python script (a simple "print" statement)
        // On every message event add that chunk to buffer
        // We add \n to the end of every message to make it appear from the new line (as in python shell)
        buffer += message + '\n';
    });

    // end the input stream and allow the process to exit
    pyshell.end(function (err) {
        if (err) {
            // If error encoutered just send it to whom requested it
            // instead of crashing whole application
            res.statusCode = 500;
            res.end(err.message);
        }
        // res.end sends python module outputs as a response to a HTTP request
        res.end(buffer);
        console.log('finished');
    });
}

और सर्वर.जेएस के अंदर:

const express = require("express")
const path = require('path');

// We are importing our function from Controllers/python-shell.js file 
// and storing it as variable called pythonShellHandler
const pythonShellHandler = require("./Controllers/python-shell")

const app = express();

// express.static will serve source files from the directory
app.use(express.static(path.join(__dirname, 'Controllers')));

// Here we are passing our imported function as a callback
// to when we are recieving HTTP request to the root (http://localhost:3000/)
app.get('/', pythonShellHandler);
app.listen(3000, function () {
    console.log('Listening');
})

जैसा कि आप देख सकते हैं। मैंने आपके कोड का पुनर्गठन किया ताकि python-shell.js अन्य .js को निर्यात करता है, एक एकल फ़ंक्शन फ़ाइल करता है जो एक्सप्रेस के req और res पैरामीटर लेता है। और सर्वर.जेएस के भीतर से मैं इस फ़ंक्शन को आयात करता हूं।

इस Node.js मॉड्यूल सिस्टम को शुरू में समझना थोड़ा मुश्किल हो सकता है। यदि आप अभी भी भ्रमित हैं, तो मैं नोड मॉड्यूल के बारे में पढ़ने की सलाह देता हूं।

नोट: यदि आपकी पायथन लिपि समाप्त होने में बहुत अधिक समय लेती है, या बिल्कुल भी समाप्त नहीं होती है। ब्राउज़र आपके अनुरोध का समय समाप्त कर देगा।

0
Link0 13 जिंदा 2020, 13:10