Узел python-shell, оставьте скрипт Python запущеннымPython

Программы на Python
Ответить
Anonymous
 Узел python-shell, оставьте скрипт Python запущенным

Сообщение Anonymous »

Кто-нибудь знает, можно ли при использовании оболочки Python поддерживать работу сценария Python при его вызове из Javascript? Может быть, вызвать метод из класса Python из Javascript с использованием оболочки Python?
Например, этот код работает, но он убивает скрипт Python каждый раз, когда он вызывается.

Код: Выделить всё

let {PythonShell} = require("python-shell");

let options = {
mode: "text",
args: ["read", "12345:2", "analogInput", "2"],
};

PythonShell.run("bac0Worker.py", options, function (err, results) {
if (err){
console.log(err)
console.log("An error happened")
}else{
// results is an array consisting of messages collected during execution
console.log("results: ", results);
console.log("Python Script Finished");
}
})
На стороне Python я экспериментирую с пакетом BAC0 для систем BACnet. Я пытаюсь выяснить, смогу ли я поддерживать работу сценария BAC0. Я думаю, что под капотом BAC0 происходит множество процессов, которые могут создавать много ненужного трафика в сети BACnet, если сценарий часто запускается/останавливается.
bac0Worker.py

Код: Выделить всё

import sys
import BAC0

BAC0.log_level('silence')
bacnet = BAC0.lite()

def do_things(address,object_type,object_instance):
try:
read_vals = f'{address} {object_type} {object_instance} presentValue'
read_result = bacnet.read(read_vals)
if isinstance(read_result, str):
pass
else:
read_result = round(read_result,2)
print(read_result)
except Exception as error:
print("read error")

def main():
# args from Javascript
first = sys.argv[1]
second = sys.argv[2]
third = sys.argv[3]
fourth = sys.argv[4]

# get sensor data
do_things(second, third, fourth)

# all done
bacnet.disconnect()

if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("bacnet app error")
bacnet.disconnect()
Как я уже говорил, код работает, если я запускаю из узла, я вижу значение датчика из сети BACnet 71,7 градуса.

Код: Выделить всё

C:\Program Files\nodejs\node.exe .\start.js
results:  (1) ['71.7']
Python Script Finished
Надеюсь, это имеет смысл, извините за странный вопрос, но любопытно, есть ли у кого-нибудь какие-нибудь советы о том, как поддерживать работу сценария Python, где я мог бы затем просто передавать значения (информацию об адресации датчика и устройства) в сценарий BAC0, чтобы запросить чтение BACnet из сети. В основной функции файла Python, если я заменю это:

Код: Выделить всё

# all done
bacnet.disconnect()
С:

Код: Выделить всё

while True:
pass
Это сохранит жизнь файлу Python. Я просто не знаю, как передавать значения в работающий скрипт Python с помощью оболочки Python. Спасибо за любые советы, здесь не так много мудрости и лучших практик. Интересно, следует ли мне изменить мою функцию do_things на класс Python с методом do_things, где тогда этот класс можно будет вызывать из Javascript?

Подробнее здесь: https://stackoverflow.com/questions/705 ... pt-running
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»