Estoy ejecutando un script de python a través de un nodo child_process. Este script de python descarga un archivo en el disco y luego devuelve el nombre del archivo al nodo. El problema que tengo es que el archivo guardado por python no aparece en mi directorio de archivos hasta que se cierra el proceso del nodo (arrojando un error ya que está tratando de leer este archivo guardado por python). No estoy seguro de cómo hacer que Python guarde "instantáneamente" el archivo para que mi proceso de nodo pueda leerlo.
Código de nodo:
var sent = false; const CP = require("child_process"); var process = CP.spawn('python', ["../pyScripts/download.py", vid_url]); process.stdout.on('data', function(data){ console.log("recieved data") if(sent === false){ sent = true process.kill('SIGINT'); doStuffWithFile(`${data.toString()}.mp4`); } });código pitón:
#*code that grabs file bytes* with open(f'{filename}.mp4', "wb") as out: out.write(vid_bytes) print(filename)Cuando escriba en un archivo, no olvide cerrarlo. Prueba esto:
#*code that grabs file bytes* with open(f'{filename}.mp4', "wb") as out: out.write(vid_bytes) out.close() print(filename)Espere el evento de salida, que indica que el proceso de Python ha finalizado.
nodo.js:
var filename = ''; var sent = false; var fs = require("fs"); const cp = require("child_process"); var process = cp.spawn('python3', ["/tmp/foo.py", "https://dl8.webmfiles.org/elephants-dream.webm"]); process.stdout.on('data', (data) => { console.log(`stdout: ${data}`); filename = data.toString().trim(); // remove trailing new line! }); process.on('exit', (code) => { console.log(`child process exited with code ${code}`); console.log('Reading: ' + filename) var stats = fs.statSync(filename) var fileSizeInBytes = stats.size; var fileSizeInMegabytes = fileSizeInBytes / (1024*1024); console.log(`Python downloaded ${fileSizeInMegabytes} MB`) });Pitón:
import time import requests import sys import shutil filename = '/tmp/test.webm' headers = {'User-Agent': 'Mozilla 5.0'} response = requests.get(sys.argv[1], stream=True, headers=headers) with open(filename, 'wb') as out_file: # with open(...) closes the file automatically shutil.copyfileobj(response.raw, out_file) print(filename)Afuera:
stdout: /tmp/test.webm child process exited with code 0 Reading: /tmp/test.webm Python downloaded 8.169429779052734 MB