2016-08-02 4 views
1

Я бегу следующий сценарий Python в Node.js через python-shell:Как запустить скрипт Python в Node.js синхронно?

import sys 
import time 
x=0 
completeData = ""; 
while x<800: 
    crgb = ""+x; 
    print crgb 
    completeData = completeData + crgb + "@"; 
    time.sleep(.0001) 
    x = x+1 
    file = open("sensorData.txt", "w") 
    file.write(completeData) 
    file.close() 
    sys.stdout.flush() 
else: 
print "Device not found\n" 

И мой соответствующий Node.js код:

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

PythonShell.run('sensor.py', function (err) { 
    if (err) throw err; 
    console.log('finished'); 
}); 
console.log ("Now reading data"); 

Выход:

Now reading data 
finished 

Но ожидаемый выход:

finished 
Now reading data 

Node.js не может выполнить мой скрипт Python синхронно, он выполняет сначала весь код, следующий за функцией PythonShell.run, а затем выполняет PythonShell.run. Как я могу выполнить первый PythonShell.run, а затем следующий код? Любая помощь будет в основном оценена ... Это чрезвычайная ситуация!

+0

Основной целью дизайна Node.js является выполнение задачи асинхронно. Не могли бы вы объяснить, почему это должно быть асинхронно? –

+0

Фактически, я использую датчик цветного детектора. Обнаружение цвета выполняется скриптом python. И на основе обнаруженного цвета я должен выполнить некоторые другие вычисления, которые выполняются с помощью node.js. Я работаю с большим проектом, и обнаружение цвета является частью моих задач, и очень легко обнаружить цвет с помощью python, но другие вычисления необходимо выполнить с помощью node.js – Ramzan

ответ

0

Как это асинхронное, добавьте концевой обратный вызов (найденный в документации) вместо инструкций на верхнем уровне

// end the input stream and allow the process to exit 
pyshell.end(function (err) { 
    if (err) throw err; 
    console.log ("Now reading data"); 
}); 
+0

Я пробовал это: если у меня есть больше кода, следующего за функцией pyshell.end() {} ', тогда программа выполнит сначала следующий код, а затем выполнит' pyshell.end() {} '. Но мне нужно, чтобы «pyshell.end() {}» нужно было выполнить сначала, а затем следующий код: – Ramzan

+1

Я думаю, вы неправильно поняли, что Клаус Д. заявил сначала: это асинхронная система. Ваш «следующий код» должен быть в обратном вызове 'pyshell.end'. Ничто не должно блокировать основную программу. Это просто, когда вы добавляете кнопку в графическом интерфейсе. Вы должны подключить обратный вызов для ответа, когда кто-то нажимает на него, но основной цикл остается свободным. –

Смежные вопросы