stdout stdin 节点到 python

stdout stdin node to python

我正在尝试学习如何使用标准输入和标准输出在节点和 Python 之间来回传递数据。

这是超级简单的东西,节点 app.js 调用 Python 文件 test.py

app.js

const spawn = require("child_process").spawn;


const pythonProcess = spawn('python3',["test.py"]);
pythonProcess.stdout.on('data', (data) => {
    
    
    mystr = data.toString();
    myjson = JSON.parse(mystr);
    console.log(myjson.Data);
    
});

test.py

import sys,json

data = {"devices":{
    "boiler":{
    "address":"12345:2",
    "object_type":"analogInput",
    "object_instance":"2"
    },
    "cooling_plant":{
    "address":"12345:2",
    "object_type":"analogInput",
    "object_instance":"2"
    },
    "air_handler_1":{
    "address":"12345:2",
    "object_type":"analogInput",
    "object_instance":"2"
    },
    "air_handler_2":{
    "address":"12345:2",
    "object_type":"analogInput",
    "object_instance":"2"
    },
    "hot_water_valve_1":{
    "address":"12345:2",
    "object_type":"analogInput",
    "object_instance":"2"
    }
}}

resp = {

    "Response": "Success",
    "Message": "from Python string",
    "Data": data

}

print(json.dumps(resp))
sys.stdout.flush()

当我 运行 $ node app 时,我可以在控制台的 python 脚本中看到 json 数据。

除了这里的零智慧之外,我还有一个问题,是否可以保留一个“运行ning”python 脚本,其中包含一个函数,我可以通过 stdin 和 stdout 将数据从节点传递到运行宁Python脚本函数?

这似乎正是 npm 包 python-shell 可以做的 from there page

谁能给我一些建议,告诉我如何传递这样的字符串:

    "12345:2 analogInput 2"

并使用 `python-shell' 使 Python 脚本 return 通过与 json 相同的字符串?

这是对一个稍微简单的问题的回答 - 我们会看看它是否有帮助。它离开 python 进程 运行,并发送消息并从 python 脚本接收消息。如果我离题太远,请随意投反对票:

app.js:

const spawn = require("child_process").spawn;


const pythonProcess = spawn('python3',["-u", "test.py"]);
pythonProcess.stdout.on('data', (data) => {
  console.log("PYTHON SENT:", data.toString());
});

let count = 0;

setInterval(function() {
  pythonProcess.stdin.write(`12345:2 analogInput ${count++}\n`);
}, 1000);

test.py

import sys

print("READY")

for line in sys.stdin:
    print("PYTHON RECEIVED: %s" % line.strip())

事情是这样的

$ node app.js 
PYTHON SENT: READY

PYTHON SENT: PYTHON RECEIVED: 12345:2 analogInput 0

PYTHON SENT: PYTHON RECEIVED: 12345:2 analogInput 1

PYTHON SENT: PYTHON RECEIVED: 12345:2 analogInput 2

PYTHON SENT: PYTHON RECEIVED: 12345:2 analogInput 3

我使用 python stdin 每秒向 python 进程发送消息,然后让您编写的回调每次都处理输出。

做这样的事情,你通常需要 python 参数 -u 否则它会缓冲输出,所以你在退出之前看不到任何东西。