如何在 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
我在 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