2012-07-26 125 views
1

我從Python線程中產生了一個Node進程,並通過stdio在它們之間傳遞數據。在Python將某些內容發送給Node後,Node會啓動一個子進程,然後將該子進程的輸出發送回Python。通過stdio在Node.js和Python之間進行通信的問題

這個工作,幾秒鐘,然後沒有更多的數據來。但是,如果我殺了Node進程,那麼突然所有的數據都會立刻出現。

我認爲這是與緩衝有關的事情,但我嘗試了很多東西,無法正常工作。

值得一提的是,如果我在Python之外運行監視器,它工作正常,所以這可能是Python方面的一些問題。

相關Python代碼:

class MonitorThread(Thread): 
    # *snip* 

    def run(self): 
     self.process = Popen(['node', 
      path.join(PACKAGE_PATH 'monitor.js')], 
      stdout=PIPE, stdin=PIPE, stderr=PIPE) 

     while self.process.poll() is None: 
      stdout = self.process.stdout.readline().rstrip('\n') 

      if stdout: 
       main_thread(debug, stdout) 

      stderr = self.process.stderr.readline().rstrip('\n') 

      if stderr: 
       main_thread(debug, stderr) 

      #time.sleep(0.1) 

相關的Node.js代碼(在CoffeeScript中,但即使你不知道你的想法):

# *snip* 

child = spawn cmd, options 

child.stdout.on 'data', (data) -> 
    process.stdout.write "stdout: #{data.toString().trim()}\n" 

child.stderr.on 'data', (data) -> 
    process.stdout.write "stderr: #{data.toString().trim()}\n" 

還有很多其他的代碼,但它並不真正相關,數據正在發送,然後數據正在被接收,只是一會兒。當我手動殺死它時,它仍然在運行,其餘數據突然出現。

Monitor [send] - {"wrap": false, "directories": {"src": "lib"}, "id": 0, "base_dir": "C:\\Users\\Joe\\Documents\\GitHub\\CoffeeScript-Sublime-Plugin"} 
Monitor [recv] - 13:55:30 - compiled src\a.coffee 
Monitor [recv] - path.exists is now called `fs.exists`. 
Monitor [recv] - 13:55:30 - compiled src\b.coffee 
  • 我試過util.pump()
  • 我試過,與重生()調用,標準輸入輸出: '繼承'
  • 我試着等待「漏'發送更多數據之前的事件。
+0

看來,輸出緩衝。這可能有助於防止緩衝:http://stackoverflow.com/questions/6471004/how-can-i-write-blocking-in-stdout-with-node-js – 2012-07-26 13:14:36

+0

這似乎沒有什麼差別,以及實際上它加劇了這個問題。 只有一條線通過而不是三條,當然現在沒有什麼東西可以通過(因爲沒有緩衝)而被殺死。 – Xavura 2012-07-26 13:21:29

+0

似乎我仍然有stdio:'繼承'。刪除後,我得到:EBADF - 錯誤的文件描述符。編輯:如果運行立體,我明白了。如果從Python內部運行,則不會出錯,但不會輸出。 – Xavura 2012-07-26 13:28:17

回答

0

你也應該通過end事件關閉流和具有節點刷新他們:

child = spawn cmd, options 

child.stdout.pipe(process.stdout) 
child.stderr.pipe(process.stdout) 

child.stdout.on 'data', (data) -> 
    process.stdout.write "stdout: #{data.toString().trim()}\n" 

child.stdout.on 'end',() -> 
    process.stdout.end() 

child.stderr.on 'end',() -> 
    process.stdout.end() 

一個更好的辦法是使用Stream.pipe()

相關問題