提问者:小点点

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


我用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脚本。。。

如果有人知道我为什么做不到,或者知道一个解决方案,提前感谢他们的回应。


共1个答案

匿名用户

正如我在评论中指出的,您的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(相同的脚本,但是我们在第一个key up事件之后完成):

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