【发布时间】:2021-12-28 20:01:13
【问题描述】:
有谁知道在使用 python-shell 时是否可以在从 Javascript 调用 python 脚本时保持运行?也许使用 python-shell 从 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 方面,我正在为 BACnet 系统试验一个名为 BAC0 的包。我想要做的是弄清楚我是否可以保持 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()
就像我提到的那样,如果我从 Node 运行,我可以看到来自 BACnet 网络 71.7 度的传感器值。
C:\Program Files\nodejs\node.exe .\start.js
results: (1) ['71.7']
Python Script Finished
希望这是有道理的,对于奇怪的问题感到抱歉,但很好奇是否有人对如何保持 Python 脚本运行有任何提示,然后我可以将值(传感器和设备寻址信息)传递给 BAC0 脚本以请求 BACnet从网络读取。在 Python 文件的 main 函数中,如果我替换这个:
# all done
bacnet.disconnect()
与:
while True:
pass
这将使 Python 文件保持活动状态我只是不知道如何使用 python-shell 将值传递给实时 Python 脚本。感谢您提供的任何提示,而不是这里的最佳实践。好奇我是否应该将我的 do_things 函数更改为一个 Python 类,并使用一个名为 do_things 的方法,然后可以从 Javascript 调用这个类?
【问题讨论】:
标签: python node.js stdout stdin