在Python代码已经运行的情况下将数据从Node.js发送到Python

时间:2018-12-19 16:31:01

标签: python node.js

我正在构建一个需要一些python后端的Electron应用程序。我不想每次需要调用数据时都运行Python脚本,因为该文件需要花一些时间才能开始(导入数据和库),但是功能非常快。

在尝试初始化python脚本后,我试图找到一种方法将数据从.js文件发送到Python文件,但是我似乎并没有完全正确。

main.js

const spawn = require("child_process").spawn;
const pythonProcess = spawn('python',["hello.py"]);
pythonProcess.stdout.on('data', (data) => {
    alert(data)
});
pythonProcess.send(2)

hello.py

import sys
import time

for line in sys.argv:
    print(line)

这将在应用程序中返回“ [Hello.py,1]”,这是从.js文件发送到.py文件的初始参数。 .js文件似乎没有执行最后一行; pythonProcess.send()。

如何最轻松地做到这一点?这样做的目的是检测sys.argv的变化并在发生这种情况时在python文件中运行一个函数。

2 个答案:

答案 0 :(得分:0)

最简单的方法是将node的标准输出通过管道传递到python的标准输入,并在Python中继续读取stdin直至结束。不好的是,您很可能希望从Node应用程序获得一些控制台输出,而您绝对不希望将其传递给Python。

第二个推荐的方法是使用tcp/ip频道。在这种情况下,您还可以从将Python应用程序移至另一台机器/容器中受益。在Python中监听tcp / ip输入非常简单,我通常使用以下方法:

from twisted.internet.protocol import Factory, Protocol
from twisted.protocols.basic import LineReceiver

class DataProcessor(LineReceiver):
  def lineReceived(self, line):
    print('Line received: {}'.format(line))

Factory factory = Factory()
factory.protocol = DataProcessor
reactor.listenTCP(8080, factory)

答案 1 :(得分:0)

您需要做的就是向您的pythoncode发出ajax请求。您可以使用jquery http://api.jquery.com/jQuery.ajax/进行此操作,也可以只使用javascript

$.ajax({
  type: "POST",
  url: "~/pythoncode.py",
  data: { param: text}
}).done(function( o ) {
   // do something
});