我正在尝试使用 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”没有被记录。 我还想从脚本返回值并在我的服务器操作中使用它
对于预期的行为,您需要确保
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
文件位于根文件夹中,如下所示。