How to run python script from nodejs on heroku - javascript

I am basically working on a NodeJS app that has some buttons and on clicking them I run some python machine learning and deep learning models but the problem is that I cant install basic python libraries like numpy. Also as soon as I add python build pack to my app it stops running. The logs show that there is no web process. I found in docs that we have to insert a Procfile.txt with npm commands but that also didn't solve the problem.
The whole setup runs perfectly on the local machine.

you need use child_process;
const { exec } = require("child_process");
exec("python path/to/the/python_script.py", (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return;
}
console.log(`stdout: ${stdout}`);
});
https://stackabuse.com/executing-shell-commands-with-node-js/
Or you can use for this npm library python

#Vladim Hulevich Thanks for replying. But I ran it like this only and it works like a charm on my local machine but when I run my script on heroku it produces error of numpy not found. But my app is basically nodejs so I only added nodejs buildpack and not python as when I add python buildpack my nodejs app also stops running

Related

How to run child_process.exec correctly on an ajax request?

There is a server, that I have an access to, but do not have ownership on. It serves a node js / express application on a default port 3000. There are several scripts, that are usually run either manually from the terminal or by cron job. What I want to do is to have a button on the client-side and make an ajax request to a certain route and execute a node js command with inline arguments. For example:
node script.js 123
All routes are set and working. I have a CliController file that handles requests and has to run the command above. Currently I am using the following code:
cp.exec(`node script.js ${ip}`, function (err, stdout, stderr) {
if (err) {
console.log(err);
}
console.log(stdout);
console.log(stderr);
});
The script.js file is in root folder of the project, but the project itself was built by using express-generator and is being served using node bin/www command. There is a service/process on the server that runs nodemon to restart this project if it fails as well. Therefore I do not have access to output of that particular process.
If I run the command above in the terminal (from the root folder of the project, to be precise), it works fine and I see the output of the script. But if I press the button on the webpage to make a request, I am pretty sure that the script does not execute, because it has to make an update to database and I do not see any changes. I also tried to use child_process.spawn and child_process.fork and failed to get it working.
I also tried to kill nodemon and quickly start the project again to the see console output. If I do this, everything works.
What am I doing wrong ?
The process invoked may be in a blocking state, hence the parent script is simply waiting for the children process to terminate, or return something.
We can avoid this behaviour right into the shell command, by adding & (ampersand control operator) at the end.
This makes a command running in the background. (Notice, you can still control the children(s) process using the PID's and POSIX signals, this is another subject, but very related and you might find it very handy pretty soon).
Also notice that killing/stopping the parent script will also kill the children(s). This can be avoided using nohup.
This is not linked to JavaScript or node.js, but to bash, and can be used with anything in the shell.
cp.exec(`node script.js ${ip} &`, function (err, stdout, stderr) {
if (err) {
console.log(err);
}
console.log(stdout);
console.log(stderr);
});
Bash reference manual

Update Nodejs App launched with Pm2 as Windows Service

I'm writing an small application in nodejs.
This app should be executed as windows service (so I can't use electron or others because It should be active even if the user is not logged), and so I have thought to use PM2.
It starts and works fine, but my problem, now, are the updates of my NodeJS app.
My app will released to many PC and I don't want update it one by one.
Yes, I have a repository where I can read and so I can create in my app a function where with established interval I go to my repo and pull.
For now I have created, in packages.json of my NodeJs app a scripts command like:
git pull //myrepourl.git origin
And in my index.js a function like:
function updateApp(){
return new Promise((resolve,reject)=>{
exec('cd app_path && npm run prod_update', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
reject();
}
resolve();
});
})
}
setInterval( ()=>{
updateApp();
console.log("------ Updated ---------")
},60*60*1000);
But this way don't convince me because actually my repo is private and then I have to expose my credentials git in app, whithout considering the problem of node_modules.
So are there others way to update a Nodejs app launched with PM2 as Service on Windows?

Integrate cli in vsCode terminal

For an extension that I am working on I would like to integrate a separate CMD window that is started by a different program in the terminal of vscode, the same way it is done currently in Emacs.
The way it currently works is that I can start the program from vsCode using the following code:
const { exec } = require('child_process');
//execCommand = "C:/.../.../gis.exe -a c:/.../.../alias start"
exec(execCommand, (err, stdout, stderr) => {
if (err)
return console.error(err);
else
console.log(stdout);
});
When this part of the code is run the program starts and then opens a separate CLI window. I would like this CLI window to be integrated in the native terminal of vscode.
Any way to "catch" the CLI window or redirect the output/input of the CLI window?
Not long ago I build a a little script that did the same thing. While I cannot share my code, the approach I took was to make my code to simulate JS key press, which will trigger the key command for opening the terminal (Ctr+`) and it worked. Hope that helps.

Executing python command line tools from NodeJS

What would be the best way to execute command line tools from nodejs to python? I'm working on a app that can generate blockchain certificates.
https://github.com/blockchain-certificates/cert-tools
This is a python based command line tool, where you can generate blockchain certificates. I have followed the steps and everything is working fine in the virtual env. But now I want to know how to implement this in to a app, where I can run the command line tools external from NodeJS. Is this possible? I have found some libraries where you can run python script from nodejs. Example I have used python shell. Whenever I run the setup script, I get missing file errors.
Can someone guide me what the best way will be to solve this problem. Thanks in advance.
You can use python shell in node, you would go about using it somewhat like the following:
var PythonShell = require('python-shell');
PythonShell.run('my_script.py', function (err) {
if (err) throw err;
console.log('finished');
});
for more documentation visit their github repository, hope i could help :)
You should just be able to execute the commands using the child_process.exec() function.
Make sure to only use the file once the python script has finished.
child_process.exec('py path/to/script.py arg1 arg2', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
// check if generated file exists
let fileExists = require("fs").existsSync("/path/to/generated/file");
if (fileExists) {
// do something with the file
}
});

nodejs print file with child-process

I'm learning nodejs and I want to send some file to the printing queue.
I tried elctron-printer and node-printer modules but actually they do not work proprly (can't detect printer with printer.list command for example). Now I'm trying to make it with child_process module and I want to know is there any posibility to start file with its associated application with "print" argument like a python can do it?
For example, this is a code sample of file execution with nodejs:
var childProcess = require('child_process');
childProcess.exec('start printme.txt', function (err, stdout, stderr) {
if (err) {
console.error(err);
return;
}
console.log(stdout);
process.exit(0);// exit process once it is opened
})
Unfortunately it seems that "print" argument is invalid for this code.
And this is a code sample for python and it works fine on windows:
import os
os.startfile('printme.txt', 'print')
All in all I hope that there is possibility to emulate system commands with nodejs.
Otherwise I will have to execute python script via nodejs just for file printing, something like this:
let python = spawn('python', [path.join(app.getAppPath(), '..', 'python_scripts/print_file.py'])
But it is terrible way to do it.

Categories