如何在 NodeJS 和 Python (pynput) 之间与子进程进行通信

How to communicate between NodeJS and Python (pynput) with child process

我在 python 中制作了一个脚本,它使用 pynput 并在控制台中显示从键盘按下的键。

from pynput.keyboard import Listener

def on_press(key):
    try:
        print('keydown : {0}'.format(
            key.char))
    except AttributeError:
        print('keydown : {0}'.format(
            key))

def on_release(key):
    try:
        print('keyup : {0}'.format(
            key.char))
    except AttributeError:
        print('keyup : {0}'.format(
            key))


with Listener(on_press=on_press, on_release=on_release) as listener:  
    listener.join()

我指出,我这辈子从来没有做过 python,当我 运行 它时,这段代码就可以工作。 我们得到了预期的结果:

keydown : a
keyup : a
keydown : b
keyup : b
keydown : Key.enter
keyup : Key.enter

但是,我想 运行 它在带有 NodeJS 的子进程中:

const child = require('child_process')
var py = child.spawn('python3', ['myFile.py'])
py.sdout.on('data', (data) => { console.log(data.toString()) })
py.stderr.on('data', (data) => { console.error(data.toString()) })

但是当我使用 NodeJS 执行 javascript 文件时,当我按下一个键时,我没有收到任何数据或错误...但是我的子进程可以与任何其他 python 脚本一起工作。 ..

如果有人知道我为什么做不到或者知道解决办法,在此先感谢他们的回复。

正如我在评论中指出的那样,您的 Node.js 应用程序不会将其输入流传递给其子进程,其子进程也不会完成以供父进程读取其输出。所以这是一个有效的例子,但在完成之前只读取第一个按键:

Node.js(相同的脚本,但我们将按键通过管道传递给子进程):

const { spawn } = require('child_process');
const readline = require('readline');

const py = spawn('python3', ['/home/telmo/Desktop/myFile.py']);

readline.emitKeypressEvents(py.stdin);
process.stdin.setRawMode(true);

py.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

py.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

py.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

Python(相同的脚本,但我们在第一个按键事件后完成):

from pynput.keyboard import Listener
import sys

def on_press(key):
    try:
        print('keydown : {0}'.format(
            key.char))
    except AttributeError:
        print('keydown : {0}'.format(
            key))

def on_release(key):
    try:
        print('keyup : {0}'.format(
            key.char))
        sys.exit()
    except AttributeError:
        print('keyup : {0}'.format(
            key))

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

运行 这些当我按下 'a' 我得到以下输出:

stdout: keyup : Key.enter
keydown : a
keyup : a

child process exited with code 0