无法从 Nextjs 运行脚本 |使用 child_process 中的 exec

问题描述 投票:0回答:1

我正在尝试使用 exec 从 nextjs 运行简单的 py/sh 脚本,但我无法实现它。

非常感谢您的帮助。

过程很简单:

我在代码中调用服务器操作,它执行脚本

页面.tsx

"use client";

import { pythonExec } from "./action";

export default function PythonClicker() {
  return <div onClick={() => pythonExec()}>Hello there</div>;
}

服务器操作

"use server";

// import { exec } from "child_process";
export const pythonExec = async () => {
  const { exec } = require("child_process");
  console.log("I am called  ");
  exec('"sample-script.py"');
};

示例脚本.py

print("Hello world")

p.s:我被呼叫正在被记录,只有“Hello world”没有被记录。 我还想从脚本返回值并在我的服务器操作中使用它

可重现的代码:https://github.com/krishnaacharyaa/python-nextjs

python node.js next.js process exec
1个回答
0
投票

对于预期的行为,您需要确保

exec
函数正确处理脚本的输出和错误。我更新了你的
pythonExec
功能。

pythonExec
:-

 "use server";

const { exec } = require("child_process");

export const pythonExec = async () => {
    console.log("I am called");

    return new Promise((resolve, reject) => {
        exec("python sample-script.py", (error, stdout, stderr) => {
            if (error) {
                console.error(`exec error: ${error}`);
                reject(error);
                return;
            }
            if (stderr) {
                console.error(`stderr: ${stderr}`);
                reject(stderr);
                return;
            }
            console.log(`stdout: ${stdout}`);
            resolve(stdout);
        });
    });
};

然后您可以在客户端页面中执行

Async/Await
以使用Python脚本的输出。考虑以下示例。

page.tsx
:-

"use client";

import { useEffect, useState } from "react";
import { pythonExec } from "./action";

export default function PythonClicker() {
  const [output, setOutput] = useState('');

  const handleClick = async () => {
    try {
      const result = await pythonExec();
      setOutput(result);
    } catch (error) {
      console.error("Error executing Python script:", error);
    }
  };

  return (
    <div>
      <div onClick={handleClick}>Run Python Script</div>
      {output && <p>Script Output: {output}</p>}
    </div>
  );
}

然后确保您的

sample-script.py
文件位于根文件夹中,如下所示。

© www.soinside.com 2019 - 2024. All rights reserved.