Nodejs child_process spawn get命令已运行

时间:2016-02-24 18:11:51

标签: node.js command-line event-handling child-process

为了澄清目的,我想看到Node.js与shell / cli运行的确切命令。不幸的是我似乎无法找到...

https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

此处返回的对象是一个事件发射器,但此时无法从Nodejs中的事件发射器中嗅探事件。我已尝试data&,pipe事件但没有成功。

child_process.spawn返回的对象包含子对象:stdoutstdinstderr。有stderrstdout的exmaples用作事件发射器&这些工作正常,但我找不到stdin ...

发出的事件

我知道我可以接受我的输入并对其进行格式化,但这很容易出现失败/不一致的情况,所以我宁愿找到一种方法来嗅探它实际使用的内容。

2 个答案:

答案 0 :(得分:0)

这里的问题是stdin是一个只写unix套接字。您可以写入childs stdin,但如果要检测任何格式,则必须在stdout的数据事件中发生。

File "C:\Users\elarrick\Desktop\rtm.py", line 142, in <module>
    im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=cm)
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 1855, in inner
    return func(ax, *args, **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\axes\_axes.py", line 5487, in imshow
    im.set_data(X)
  File "C:\Python27\lib\site-packages\matplotlib\image.py", line 653, in set_data
    raise TypeError("Invalid dimensions for image data")
TypeError: Invalid dimensions for image data

我希望我能解释一下您的满意吗?如果没有,请举个例子,说明为什么要查看哪些stdin消息正在外部程序上到达。 (如果有办法,那么我怀疑您将得到的只是您写入的相同数据)

答案 1 :(得分:0)

x Init id time 1 2019-01-01 12:00:00 0.1 2019-01-01 2019-01-02 12:00:00 0.1 2019-01-01 2 2020-02-01 12:00:00 0.9 2020-01-01 2020-01-01 12:00:00 0.1 2020-01-01 上有一个传入数据的事件,称为 stdin

"data"
  • 虽然一些应用程序逐行处理输入,但其他应用程序更具交互性并实时处理按键操作(例如箭头键在列表中向上/向下移动)。
  • 虽然一些应用程序需要纯文本,但其他应用程序将使用二进制数据。

在各种可能的情况下,您在这里几乎是靠自己的。 我通常会创建一个 process.stdin.on("data", (data) => {} ); ,它只是缓冲所有输入并将其转换为适合我的特定用例的事件。

下面是阅读器的最基本示例之一,每次接收到一行文本时都会触发事件。

InputReader

实际上,您可以使用 export class DataReader { private buffer = ""; constructor(private listener: (err, line: string)=>any ) { } processData(data) { // remove carriage returns, and add data to the buffer. data = data.toString().replace(/\r/g, ''); this.buffer += data; // get only the complete data. const lastNewlineIndex = this.buffer.lastIndexOf('\n'); if (lastNewlineIndex < 0) return; if (this.listener != null) { // split data in lines const completeData = this.buffer.slice(0, lastNewlineIndex); const lines = completeData.split('\n'); for (const line of lines) { // notify listener line by line. this.listener(null, line); } } // remove processed data from the buffer. this.buffer = this.buffer.slice(lastNewlineIndex + 1); } } 或某个 EventEmitter 来调度输出。

Observable