2015-06-07 2 views
1

Мне нужно вызвать этот скрипт python в NodeJs.Как вызвать скрипт python из 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" 

Я использовал питона-оболочку, вот код NodeJs для этого

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); 
}); 

Но когда я побежал это Код Я ничего не видел в стороне узла. Я думаю, проблема возникает, когда скрипт python приходит на этот уровень.

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

Потому что я просто работал с циклом while, который имеет только инструкцию печати, тогда он работает. После этого я попробовал еще один способ добиться этого. Но у меня такая же проблема, которая у меня есть с above.Here это еще один метод

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..."); 
}); 

Любая помощь будет оценена

ответ

6

Есть несколько способов сделать это.

  • первый способ, делая npm install python-shell

и вот код

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 

Вы можете отправить сообщение для питона оболочки с использованием pyshell.send('hello');

вы можете найти ссылку на API здесь - https://github.com/extrabacon/python-shell

  • второй путь - другой пакет, который вы можете обратиться к является узел питон, вы должны сделать npm install node-python

  • третий путь - вы можете обратиться к этому вопросу, где вы можете найти пример использования детского Процесс- How to invoke external scripts/programs from node.js

несколько больше ссылок - https://www.npmjs.com/package/python

я f вы хотите использовать сервис-ориентированную архитектуру - http://ianhinsdale.com/code/2013/12/08/communicating-between-nodejs-and-python/