I'd like to have some python code running and communicating with a nodejs express server. So far, I can get my nodejs server to call python functions via one of two mechanisms, either to spawn a python task or to have it talk to a zerorpc python server.
For the first, a la http://www.sohamkamani.com/blog/2015/08/21/python-nodejs-comm/, this works:
var express = require( "express" );
var http = require( "http" );
var app = express();
var server = http.createServer( app ).listen( 3000 );
var io = require( "socket.io" )( server );
app.use( express.static( "./public" ) );
io.on( "connection", function( socket ) {
// Repeat interval is in milliseconds
setInterval( function() {
var spawn = require( 'child_process' ).spawn,
py = spawn( 'python', [ 'mytime.py' ] ),
message = '';
py.stdout.on( 'data', function( data ) {
message += data.toString();
});
py.stdout.on( 'end', function() {
socket.emit( "message", message );
});
}, 50 );
});
Where mytime.py is
from datetime import datetime
import sys
def main():
now = datetime.now()
sys.stdout.write( now.strftime( "%-d %b %Y %H:%M:%S.%f" ) )
And with zerorpc http://www.zerorpc.io/, if this python code is running:
from datetime import datetime
import sys
import zerorpc
class MyTime( object ):
def gettime( self ):
now = datetime.now()
return now.strftime( "%-d %b %Y %H:%M:%S.%f" )
s = zerorpc.Server( MyTime() )
s.bind( "tcp://0.0.0.0:4242" )
s.run()
This nodejs code works:
var express = require( "express" );
var http = require( "http" );
var app = express();
var server = http.createServer( app ).listen( 3000 );
var io = require( "socket.io" )( server );
var zerorpc = require( "zerorpc" );
var client = new zerorpc.Client();
client.connect( "tcp://127.0.0.1:4242" );
app.use( express.static( "./public" ) );
io.on( "connection", function( socket ) {
// Repeat interval is in milliseconds
setInterval( function() {
client.invoke( "gettime", function( error, res, more ) {
socket.emit( "message", res.toString( 'utf8' ) );
} );
}, 50 );
});
But what I'd like to be able to do is instead of just having python functions called, I'd like a separate python process running and sending messages to the nodejs server which listens for them and then handles them. I've experimented with middleware socketio-wildcard, but if I try to set up a python server with zerorpc on the same port as the nodejs express server, it gives a zmq.error.ZMQError: Address already in use error.
I know that I'm not thinking about this right--I know that I'm missing some logic around interprocess communication due to my naïveté here--so if there is a better way to do message sending from a python process with a nodejs server listening, I'm all ears.
Any ideas?
Many thanks in advance!
js and Python finding out that Node. js is awesome for Web Development and Python for Data Sciences. Actually, we don't need to always stick with the same programming language as there are ways to use them both together. In this article, I will show you an example of how to use a Python script from the Node.
To call a Python function from Node. js, we can call the spawn method. const { spawn } = require("child_process"); const pythonProcess = spawn('python', ["path/to/script.py", arg1, arg2]); to call the spawn method available in the child_process module.
We can implement machine learning algorithms, deep learning algorithms and many features provided via Python library into Node JS application. Child Process allows us to run Python script in Node JS application and stream in/out data into/from Python script.
For those trying to figure this out, here's a solution thanks to Zeke Alexandre Nierenberg
For the node.js server code:
var express = require( "express" );
var app = express();
var http = require( "http" );
app.use( express.static( "./public" ) ); // where the web page code goes
var http_server = http.createServer( app ).listen( 3000 );
var http_io = require( "socket.io" )( http_server );
http_io.on( "connection", function( httpsocket ) {
httpsocket.on( 'python-message', function( fromPython ) {
httpsocket.broadcast.emit( 'message', fromPython );
});
});
and the python code that sends it messages:
from datetime import datetime
from socketIO_client import SocketIO, LoggingNamespace
import sys
while True:
with SocketIO( 'localhost', 3000, LoggingNamespace ) as socketIO:
now = datetime.now()
socketIO.emit( 'python-message', now.strftime( "%-d %b %Y %H:%M:%S.%f" ) )
socketIO.wait( seconds=1 )
Voilà!
I had some problems with socketIO version...
so, this is my Solution:
NodeJS:
var app = require("express")();
var http = require('http').Server(app);
var bodyParser = require('body-parser');
app.use(bodyParser.json())
app.post('/',function(req,res){
var msg=req.body.msg;
console.log("python: " + msg);
});
http.listen(3000, function(){
console.log('listening...');
});
on Python:
import requests
import json
url = "http://localhost:3000"
data = {'msg': 'Hi!!!'}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
r = requests.post(url, data=json.dumps(data), headers=headers)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With