Tengo este código js:
const python = spawn('python', [path.join(settings.PROJECT_DIR, '/tests_explorer/scripts/product/product.py').replace(/\\/g, "/"), 'node.js', 'python']); python.stdout.on('data', function (data) { console.log('Pipe data from python script ...'); dataToSend = data.toString(); console.log(dataToSend) });Debería ejecutar mi python Script product.py:
import sys import general.general //my own utils print('#Hello from python#') print('First param:'+sys.argv[1]+'#') print('Second param:'+sys.argv[2]+'#') name = general.id_generator(9) print(name)Pero el nodo js parece omitido para ejecutar mi python, si no importo general.general, que es mi propia utilidad para generar un nombre aleatorio, el python se ejecuta bien y puedo ver los datos de impresión. ¿Alguien sabe cómo resolver esto? Gracias
Compruebe si está presente en la ruta ( process.env.PATH ), si python existe en su sistema (puede ser python3 o python2 ) y si la ruta al archivo es correcta y quizás no dependa del sistema operativo:
const { spawn } = require('child_process'); const py = spawn('python3', ['-c', 'print("hello")']); py.stdout.on('data', (data) => {console.log(`stdout: ${data}`);}); Funciona en CLI/REPL porque mantiene el proceso abierto. Sin embargo, en un archivo, no lo hace, por lo tanto, la programación basada en eventos no recibe el evento antes de que el bucle de eventos logre cerrarse (algo así como while (true) {} en segundo plano con interrupciones consistentes para que su código pueda ejecutar en el medio ).
Para eso, puede utilizar spawnSync() que bloqueará el programa hasta que se genere el proceso, se intercambien los datos y se cierre el proceso.
const { spawnSync } = require('child_process'); const py = spawnSync('python3', ['main.py']); console.log(py.output.toString()); O como en la pregunta vinculada, setTimeout() u otros trucos del sistema para esperar básicamente a que el bucle de eventos procese su evento (en este caso on("data", ...) debido a la naturaleza asíncrona del módulo child_process .