web-dev-qa-db-fra.com

Comment appeler le script python à partir de NodeJs

J'ai besoin d'appeler ce script python dans NodeJs.

Read.py

#!/usr/bin/env python
# -*- coding: utf8 -*-

import RPi.GPIO as GPIO
import MFRC522
import signal

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()

# Welcome message
print "Welcome to the MFRC522 data read example"
print "Press Ctrl-C to stop."

# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:

    # Scan for cards    
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

    # If a card is found
    if status == MIFAREReader.MI_OK:
    # Get the UID of the card
    (status,uid) = MIFAREReader.MFRC522_Anticoll()

    # If we have the UID, continue
    if status == MIFAREReader.MI_OK:

        # Print UID
        print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])

        # This is the default key for authentication
        key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]

        # Select the scanned tag
        MIFAREReader.MFRC522_SelectTag(uid)

        # Authenticate
        status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)

        # Check if authenticated
        if status == MIFAREReader.MI_OK:
            MIFAREReader.MFRC522_Read(8)
            MIFAREReader.MFRC522_StopCrypto1()
        else:
            print "Authentication error"

J'ai utilisé python-Shell, voici le code NodeJs pour ça

Test.js

var PythonShell = require('python-Shell');

var options = {
scriptPath: '/home/pi/gpio-admin/MFRC522-python/'
};
var pyshell = new PythonShell('Read.py',options);


pyshell.on('message', function (message) {

    console.log(message);
});

Mais lorsque j'ai exécuté ce code, je n'ai rien vu du côté Node. Je pense que le problème se produit lorsque le script python arrive à ce niveau).

   (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

Parce que je viens de courir avec la boucle while qui n'a qu'une instruction print alors ça marche. Après cela, j'ai essayé une autre façon d'y parvenir. Mais j'ai le même problème que j'ai avec ci-dessus. Voici une autre méthode

AltTest.js

var python = require('child_process').spawn(
 'python',
 // second argument is array of parameters, e.g.:
 ["/home/pi/gpio-admin/MFRC522-python/Read.py"]
 );
 var output = "";
 python.stdout.on('data', function(){ 

    output += data ;
    console.log(data);
});
 python.on('close', function(code){ 

   console.log("Here you are there...");
 });

Toute aide serait appréciée

9
GPrathap

Il existe plusieurs façons de procéder.

  • la première façon est de faire npm install python-Shell

et voici le code

var PythonShell = require('python-Shell');
//you can use error handling to see if there are any errors
PythonShell.run('my_script.py', options, function (err, results) { 
//your code

vous pouvez envoyer un message à python Shell en utilisant pyshell.send('hello');

vous pouvez trouver la référence API ici- https://github.com/extrabacon/python-Shell

quelques références supplémentaires - https://www.npmjs.com/package/python

si vous souhaitez utiliser une architecture orientée services - http://ianhinsdale.com/code/2013/12/08/communicating-between-nodejs-and-python/

19
Tejus Prasad
  • installer python-Shell: - npm installer python-Shell

    Index.js

    let {PythonShell} = require('python-Shell')
    
    function runPy(){
        return new Promise(async function(resolve, reject){
              let options = {
              mode: 'text',
              pythonOptions: ['-u'],
              scriptPath: './test.py',//Path to your script
              args: [JSON.stringify({"name": ["xyz", "abc"], "age": ["28","26"]})]//Approach to send JSON as when I tried 'json' in mode I was getting error.
             };
    
              await PythonShell.run('test.py', options, function (err, results) {
              //On 'results' we get list of strings of all print done in your py scripts sequentially. 
              if (err) throw err;
              console.log('results: ');
              for(let i of results){
                    console.log(i, "---->", typeof i)
              }
          resolve(results[1])//I returned only JSON(Stringified) out of all string I got from py script
         });
       })
     } 
    
    function runMain(){
        return new Promise(async function(resolve, reject){
            let r =  await runPy()
            console.log(JSON.parse(JSON.stringify(r.toString())), "Done...!@")//Approach to parse string to JSON.
        })
     }
    
    runMain() //run main function
    

test.py

    import sys #You will get input from node in sys.argv(list)
    import json
    import pandas as pd #Import just to check if you dont have pandas module you can comment it or install pandas using pip install pandas

    def add_two(a, b):
        sum = 0
        for i in range(a, b):
            sum += i
        print(sum)  

    if __name__ == "__main__":
        print("Here...!")
        # print(sys.argv)
        j = json.loads(sys.argv[1]) #sys.argv[0] is filename
        print(j)
        add_two(20000, 5000000) #I make this function just to check 
    # So for all print done here you will get a list for all print in node, here-> console.log(i, "---->", typeof i)
4
Tanmay Shrivastava

Adoptez une approche de micro-services. Hébergez le script Python en tant que service API HTTP REST. Consommez l'API à partir de node.js - vous n'avez pas besoin d'intégrer les technologies; elle n'est pas évolutive.

2
Adam

Eh bien, vous pouvez exécuter le script python à partir de node.js d'une manière comme celle-ci. Utilisez child_process.spawn ( c'est construit dans la bibliothèque node.js )

router.get('/', (req, res) => {
    const {spawn} = require('child_process');
    const path = require('path');
    function runScript(){
        return spawn('python', [
              path.join(__dirname, '../../scripts/myscript.py'),
              '-some_arg',
              '--another_arg',
        ]);
    }
    const subprocess = runScript();
    // print output of script
    subprocess.stdout.on('data', (data) => {
            console.log(`data:${data}`);
    });
    subprocess.stderr.on('data', (data) => {
           console.log(`error:${data}`);
    });
    subprocess.stderr.on('close', () => {
               console.log("Closed");
    });
    // const subprocess = runScript()
    res.set('Content-Type', 'text/plain');
    subprocess.stdout.pipe(res);
    subprocess.stderr.pipe(res);
});
0
Archil Labadze