Read the statement by Michael Teeuw here.
Executing python in js - troublshooting/development
-
Hmmm I did this in the terminal:
$ chmod +x /home/pi/Desktop/realTester.pyNothing changed… still the same error log message… I think there’s something wrong with my custom’s css file since it says it’s not loading… in my css folder there’s only a main.css file there
-
@beejay22 so, can u run the script from the terminal like before
python /home/pi/Desktop/realTester.py
and then /home/pi/Desktop/realTester.pyboth should work, produce the same results
that $ wasn’t part of the chmod -
I didn’t add the $ to the command, I just said that in my post for clarity lol. I typed just this in the command line:
chmod +x /home/pi/Desktop/realTester.pyAnd yes I can run my script in the terminal with “python3 /home/pi/Desktop/realTester.py” but not with “/home/pi/Desktop/realTester.py” because the module I’m using in my script includes bs4 which is available with python3 I believe so I have to say python3
I also tried ‘touch ~/MagicMirror/css/custom.css’, still showing same error log
-
@beejay22 u can run python3 as the shebang. I was just giving example
your node_helper code was spawning python, not python3. I just copied what u did. u can put python3 in the spawn as well
custom.css, doesn’t matter, it’s empty so no harm
-
Tried this (all I changed was “python” to “python3”):
const spawn = require("child_process").spawn var NodeHelper = require("node_helper") module.exports = NodeHelper.create({ socketNotificationReceived: function(notification, payload) { switch(notification) { case "GIVE_ME_DATA": this.job() break } }, job: function() { var process = spawn("python3", ["/home/pi/Desktop/realTester.py"]) process.stdout.on("data", (data)=>{ console.log(data) var result = String.fromCharCode.apply(null, new Uint16Array((data))) this.sendSocketNotification("HERE_IS_DATA", data) }) } })
And also changed pyscript to this (just added python3 to the shebang):
#!/usr/bin/python3 from bs4 import BeautifulSoup import requests url=requests.get("https://www.whitehouse.gov/presidential-actions/") src=url.content soup = BeautifulSoup(src, 'lxml') for h2_tag in soup.findAll('h2'): a_tag = h2_tag.find('a') print(a_tag.string)
Also tested “python” again (not python3) in my node_helper along with the updated shebang as shown above
If custom.css file doesn’t matter I wonder why it’s giving this error… Have no clue what’s going on now lol
-
@beejay22 u need the fix for the data conversion… as well…
custom.css cause its a file t=hat MM force loads, and while the browser is unhappy (thus the error), the MM runtime doesn’t care WHY there was no data, missing file, empty file, don’t care there were no css updates…
i don’t do python so I can’t help much…
but you gotta put in the fixes I gave you for data…
process.stdout.on("data", (data)=>{ console.log(data.toString()) // debugging, log string //var result = String.fromCharCode.apply(null, new Uint16Array((data))) this.sendSocketNotification("HERE_IS_DATA", data.toString()) // pass the string, module expects string })
-
Sorry I copied the wrong node_helper.js file in my last post. This is how it looks like now:
//node_helper.js const spawn = require("child_process").spawn var NodeHelper = require("node_helper") module.exports = NodeHelper.create({ socketNotificationReceived: function(notification, payload) { switch(notification) { case "GIVE_ME_DATA": console.log("received notification") this.job() break } }, job: function() { var process = spawn("python3", ["/home/pi/Desktop/realTester.py"]) process.stdout.on("data", (data)=>{ console.log(data.toString()) this.sendSocketNotification("HERE_IS_DATA", data.toString()) }) } })
I was trying to test if I can at least print something to magic mirror without a pyscript… node_helper looks like this:
//node_helper.js const spawn = require("child_process").spawn var NodeHelper = require("node_helper") module.exports = NodeHelper.create({ socketNotificationReceived: function(notification, payload) { switch(notification) { case "GIVE_ME_DATA": console.log("received notification") this.job() break } }, job: function() { var process = spawn("python3", ["/home/pi/Desktop/test.py"]) process.stdout.on("data", (data)=>{ data= "Hello World"; console.log(data.toString()) this.sendSocketNotification("HERE_IS_DATA", data.toString()) }) } })
Hello World appears on MagicMirror but the test file that’s provided in the path (the test file just has: print(“this works”) does not so I’m not sure why I need to provide var process spawn if Hello World prints by itself… Anyways, I’m aware that there’s other ways to execute the child process however I’m not familiar with it. Please correct me if I’m wrong but can exec work in this situation as well? (pyscipt just prints out the latest titles when magic mirror restarts). I’m trying anything and everything at this point
And I added the default and start function to my core module although I don’t think I have to use it. This is how it looks like now:
/// MMM-Whitehouse.js - Core Module Module.register("MMM-Whitehouse", { defaults: {}, start: function () {}, getDom: function() { var e = document.createElement("div") e.id = "DISPLAY" return e }, notificationReceived: function(notification, payload, sender) { switch(notification) { case "DOM_OBJECTS_CREATED": var timer = setInterval(()=>{ this.sendSocketNotification("GIVE_ME_DATA") }, 1000) break } }, socketNotificationReceived: function(notification, payload) { switch(notification) { case "HERE_IS_DATA": var e = document.getElementById("DISPLAY") e.innerHTML = payload break } }, })
-
@beejay22 I don’t understand why u have trouble.
the 3 files I posted work together as u designed.
does your spawn(‘/use/bin/python’, [execname]) work to return the data.
console log to seespawn and exec have different methods of returning the data. see the doc
Google search nodejs process spawn
-
Did you try it with the pyscript? Or are you talking about it the core module, node_helper and config?
And okay
-
@beejay22 I am only working on inside MagicMirror
the spawn on.data() gets called when the pgm launched outputs to stdout. my print hello
of course I made sure the python script worked both ways, before showing that