【问题标题】:How to load data from Python and save to a variable in JavaScript如何从 Python 加载数据并保存到 JavaScript 中的变量
【发布时间】:2020-11-13 18:53:55
【问题描述】:

我正在做一个项目,我需要在 Python 中使用一些库,但是,该项目的大部分内容将使用 Javascript(React Native)进行编码。

我目前正在玩从 JavaScript 调用 Python,我想将从 Python 调用的数据保存到我的 JavaScript 文件中的变量中。

这是我目前正在玩的代码:

index.js

const spawn = require("child_process").spawn;

const process = spawn("python", ["./hello.py", 4]);

var result;

process.stdout.on("data", (data) => {
  result = parseInt(data.toString());
});

var newNum = result * 10;
console.log(newNum);

你好.py

import sys

sum = 0
sum = int(sys.argv[1])
sum = sum*3

print(sum)

但是,控制台输出只是“未定义”,我该怎么做才能解决这个问题?

谢谢

【问题讨论】:

  • 由于 Node.js 是异步的,因此您需要等待子进程退出,然后再尝试对 result 进行操作。
  • 我该怎么做?

标签: javascript python node.js


【解决方案1】:

由于 Node.js 是异步的,您需要等待子进程退出,然后再尝试对 result 进行操作。让我举例说明:

const spawn = require("child_process").spawn;
const process = spawn("python", ["./hello.py", 4]);
// A process was started in the background, and your code continues...
// You declare a `result` variable, whose value is `undefined`...
var result;
// Python might still be starting up at this point...
// You register a handler for output from the process, but it might not get called
// yet since your computer is from 1996 and it takes a while to start Python...
process.stdout.on("data", (data) => {
  result = parseInt(data.toString());
});
// You operate on the `result`, which still is undefined...
var newNum = result * 10;
// Oh! Hey! Python started in the background! It printed out some data, and now the data handler from before got called! Yay! `result` is indeed 12 right now!
// but... you know... let's print `undefined * 10`.
console.log(newNum);

您可以改为等待标准输出流结束:

const spawn = require("child_process").spawn;

const process = spawn("python", ["./hello.py", 4]);

var result;

process.stdout.on("data", (data) => {
  result = parseInt(data.toString());
});

process.stdout.on("end", () => {
  var newNum = result * 10;
  console.log(newNum);
});

或者进程退出:

const spawn = require("child_process").spawn;

const process = spawn("python", ["./hello.py", 4]);

var result;

process.stdout.on("data", (data) => {
  result = parseInt(data.toString());
});

process.on("exit", () => {
  var newNum = result * 10;
  console.log(newNum);
});

您可以将其包装成一个简洁的帮助函数,该函数返回一个承诺(未经测试,抱歉):

const spawn = require("child_process").spawn;

function spawnAndCaptureOutput(command, args) {
  return new Promise((resolve) => {
    const process = spawn(command, args);
    let stdout = "";
    let stderr = "";
    process.stdout.on("data", (data) => {
      stdout += data.toString();
    });
    process.stderr.on("data", (data) => {
      stderr += data.toString();
    });
    process.on("close", (code) => {
      resolve({ stdout, stderr, code });
    });
    // TODO: error handling?
  });
}

spawnAndCaptureOutput("python", ["./hello.py", 4]).then(
  ({ stdout }) => {
    const number = parseInt(stdout);
    console.log(number * 8);
  },
);

【讨论】:

  • 好的,这适用于获取新号码,但假设我想在该 JavaScript 文件中的程序的其他部分中使用该数据?
  • promise 函数应该会有所帮助,因为您将输出作为字符串。
  • 我不太明白你的意思,我不确定你是否明白我的意思。假设我正在处理我的 JS 文件中的一些数据,我需要 Python 对这些数据进行一些修改,我希望能够调用一个函数,然后返回一个我可以分配给一个变量的值在我的 JS 文件中使用。例如,我希望从 Python 检索到的值存储在我的 JS 文件中的 GLOBAL 变量中。
  • 好的,我想我可能有一个解决方法,直到我尝试完全实现我打算用 JS 和 Python 方法做的事情之前我不会知道。但是,我认为在 process.stdout.on("end"... 方法期间,我可以调用另一个函数并将该值传递给它,我遇到的问题是将 Python 返回的值分配给一个新变量。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多