2017-06-16 45 views
1

我有點修復 - 我在後端運行了一個node.js應用程序,並且有一段用Python編寫的代碼。這個Python程序需要在後臺不斷運行,我需要從某個客戶端的API調用中的JavaScript代碼中調用該程序中的函數。
我正在考慮將Python程序作爲守護程序運行,但是我無法找到任何有關如何通過javascript代碼調用該守護程序的功能的任何信息。
我從來沒有與守護進行過任何工作,所以在這一點上,我很無知。我想知道這樣的事情是否可能。

我能想到的唯一的其他選擇是切換到Django並將數據作爲Django應用程序本身的一部分進行維護。我可以做到這一點,但我不想。我無法在JavaScript中編寫Python代碼,因爲它依賴於我在npm上找不到的某些專用庫。

如果有人遇到過這個問題,請告訴我。謝謝!調用python函數的節點js後端

+0

在啓動腳本(假設一個Linux環境)不能啓動python部分嗎?或者流程需要溝通? – Mikael

+0

他們需要溝通。實質上,我希望JavaScript部分在每次調用API時觸發一個python函數。 – Zeokav

+0

Python程序可以啓動一個偵聽特定端口的套接字服務器。我假設Python程序中的函數需要輸入參數,以便Node應用程序可以連接並寫入該套接字。然後,Python端的套接字偵聽器將處理傳入的連接/數據並執行所需的例程。不確定Python,但它是Java中的幾行代碼,例如 – marekful

回答

1

下面是一個簡單的例子(與pip install flask)。假設函數是「這是一個真正的單詞」;而重要的準備工作是加載字典。這裏是代碼:

from flask import Flask, request, jsonify 
app = Flask(__name__) 

# heavy loading 
dictionary = frozenset(
     line.rstrip('\n') for line in open('/usr/share/dict/words')) 

# lightweight processing 
@app.route('/real_word', methods=['POST']) 
def real_word(): 
    result = request.form['word'] in dictionary 
    return jsonify(result) 

# quick-and-dirty start 
if __name__ == '__main__': 
    app.run(host='127.0.0.1', port=7990) 

當你運行它,你可以執行一個請求127.0.0.1:7990/real_word,發送您的字作爲POST參數。例如,假設npm install request

var request = require('request'); 

function realWord(word) { 
    return new Promise(function(fulfill, reject) { 
    request.post(
     'http://127.0.0.1:7990/real_word', { 
     form: { 
      word: word 
     } 
     }, 
     function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      fulfill(JSON.parse(body)); 
     } else { 
      reject(error, response); 
     } 
     } 
    ); 
    }); 
} 

realWord("nuclear").then(console.log); // true 
realWord("nucular").then(console.log); // false 

(顯然,在示例中那麼簡單,文字閱讀的名單幾乎沒有「重」,而且也實在沒有理由JSONify一個布爾,但你可以採取完全相同相同的代碼結構並將它用於包裝幾乎所有的功能,並且可以連續輸入任何類型的輸入/輸出。)

如果只是爲了您的需要,您可以直接運行Python程序;如果你想要的是生產質量的東西,請查看如何在WSGI容器上託管Flask應用程序,例如Gunicorn或mod_wsgi。

0

您可以使用節點的子進程來調用python腳本,如果你願意,你甚至可以將結果返回給javascript?

​​

https://medium.freecodecamp.com/node-js-child-processes-everything-you-need-to-know-e69498fe970a

Javascript.js

var exec = require('child_process').exec; 


cmd = `python python.py` // insert any command line argument 


exec(cmd, function(error, stdout, stderr) { 
    console.log(stdout); 
}); 

Python.py

print("Heyo"); 

即使壽這個例子只捕獲從控制檯的單一輸出,可以實現流。

+0

「這個Python程序需要在後臺不斷運行」 - 大概是因爲該程序有一個可怕的啓動成本。這使得需求過程不可行。 – Amadan

+0

授予我的示例不流式輸出,調整示例以流式輸出應該很簡單。仍然不知道如何使用套接字將是一個更好的解決方案。 – Rheijn

+0

嘿我感謝您的迴應,但這不是我所需要的。我需要js不斷與python進行交互。而@Amadan是對的。每當我收到請求時(甚至可能是每秒多次),我都想要避免形成巨大的關係圖。 – Zeokav