2016-11-19 81 views
1

我有一個帶有兩個參數的python腳本;一個目錄和一個文件名。通過spawn從python返回JSON到節點

python腳本將從提供的目錄中的特定文件創建一個JSON對象,並使用名稱作爲第二個參數保存該對象。

但是,如果第二個參數等於字符串「stream」,則JSON數據將輸出到STDOUT。

我寫了一個節點腳本,它產生一個子進程從終端調用python腳本,它按預期工作。

"use strict"; 
 

 
const spawn = require("child_process").spawn; 
 

 
const command = "(path to python)"; 
 
const loc = "(path to .py script)"; 
 

 
const acct = process.argv[2]; 
 
const output = process.argv[3]; 
 

 
let callPy = spawn(command, ["erik.py", acct, output], { 
 
    cwd: loc, 
 
    stdio: "pipe" 
 
}); 
 

 
callPy.stdout.on("data", (data) => { 
 
    if (data.toString() === "success") { 
 
     console.log(acct, "generated"); 
 
    } else { 
 
     console.log(data.toString()); 
 
    } 
 
});

編輯:

我有無人盯防的解決了這個問題:花多一點的時間來實現這個之後,我還沒有得出一個滿意的解決方案,讓我同步地從節點調用子進程,指示python腳本發出JSON數據,接收數據,然後將數據發送到瀏覽器。我試着用的子進程承諾鏈:

let child = require("child_process").spawn; // or spawnSync 
 

 
let spawn =() => { 
 
    let spawned = child(command, args, options,(err, stdout, stderr) => { 
 
     if (err) { console.log(err) }; 
 
    }); 
 
    return spawned 
 
}; 
 

 
let listen = (child) => { 
 
    child.stdout.on("data", (data) => { 
 
     console.log("PID", child.pid); 
 
     console.log("data from listen func: ", data); 
 
     return child 
 
    }); 
 
}; 
 

 
let kill = (child) => { 
 
    child.kill("SIGTERM"); 
 
} 
 

 
var p = new Promise((res, e) => { 
 
    res(spawn()) 
 
    e(console.error(e)) 
 
}); 
 

 
p.then(result => { 
 
    return listen(result); 
 
    }) 
 
    p.then(result => { 
 
     return kill(result); 
 
}); 
 

使用spawn()孩子的任何數據使用spawnSync()承諾鏈試圖返回 (和失敗)之前終止上偵聽孩子的io之前產生的孩子

我還沒有嘗試websockets傳輸數據,但我懷疑這將解決這個問題,承諾返回一個空的對象到我的路由器函數調用之前親mise chain從python腳本中檢索塊。

歡迎進一步瞭解。

回答

0

我能夠相對簡單地解決這個問題的WebSockets使用:

客戶端提交的請求,這是傳達給通過socket.IO服務器,收到請求且觸發事件產卵,當塊完成附加終止事件發出觸發子進程的殺戮和將數據返回給客戶端

1

因此,你需要至少兩件事情要做到這一點

  • 排隊的命令來執行的一種方式與spawn
  • 甲異步模式以等待一個命令的執行,並加入處理時的每個可執行終止

一個簡約例子是

var cmd = new CommandLine({ 
    debug : true, 
    error : true, 
    delay : true }); 
// commandItemsArray is a list of commands list, command options, command arguments 
commandItemsArray = [ ['ls','-l','./'], ['ls','-a','./'] ]; 
cmd.executeCommands(commandItemsArray 
, function(results) { 
    console.log(results); 
} 
, function(error) { 
    console.log(error); 
}); 

有幾個包上NPM做到既(搜索節點命令行等),一個是這一個node-commander,它使用Promise.all模式來實現第二個任務:

 function PromiseAll(items, block, done, fail) { 
     var self=this; 
     var promises = [], index=0; 
     items.forEach(function(item) { 
      promises.push(function(item,i) { 
       return new Promise(function(resolve, reject) { 
       return block.apply(this,[item,index,resolve,reject]); 
       }); 
      }(item,++index)) 
     }); 
     Promise.all(promises).then(function AcceptHandler(results) { 
      if(done) done(results); 
     }, function ErrorHandler(error) { 
      if(fail) fail(error); 
     }); 
     } //promiseAll