最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node項目中調用執(zhí)行python腳本的方法詳解

 更新時間:2026年03月05日 08:35:32   作者:允許部分打工人先富起來  
這篇文章主要為大家詳細介紹了node項目中調用執(zhí)行python腳本的兩個常用方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

一、環(huán)境配置

Windows + PowerShell 命令:

  • 在node項目中新建python文件夾,以及子文件夾scripts用于放置python腳本
  • 創(chuàng)建虛擬環(huán)境 cd python -> python -m venv venv
  • 進入虛擬環(huán)境并install腳本中的依賴:venv\Scripts\Activate.ps1 -> 單個安裝 pip install pandas
  • 不要把 venv 提交到 git
// .gitignore
python/venv/
__pycache__/
*.pyc

只提交依賴清單

執(zhí)行:pip freeze > requirements.txt 提交這個文件即可

服務器部署時重新創(chuàng)建環(huán)境

  • python -m venv venv
  • pip install -r requirements.txt

二、運行python腳本

方法一:用spawn 子進程通信(不建議)

缺點:頻繁 spawn 會很慢,stdout 容易污染

注意:

  • 絕對路徑的拼接,以及腳本里如果有讀取文件代碼時的文件路徑
  • Python腳本里不能隨便 print,因為node必須自己保證輸出是 JSON
const { spawn } = require("child_process");
const path = require("path");
const rootPath = path.resolve(__dirname, "..");
// 1?? 定位 Python 解釋器路徑:E:\node\xxx\python\venv\Scripts\python.exe
const pythonPath = path.join(
  rootPath,
  "python",
  "venv",
  "Scripts",
  "python.exe",
);
// 2?? 定位 Python 腳本路徑:E:\node\xxx\python\scripts\test.py
const scriptPath = path.join(
  rootPath,
  "python",
  "scripts",
  "test.py",
);
// ?? 全局執(zhí)行鎖
let isRunning = false;

// 注意腳本文件里訪問文件時的路徑,要用絕對路徑
exports.get_info = (req, res) => {
  if (isRunning) {
    return res.send({
      status: 429,
      message: "任務正在執(zhí)行中,請稍后再試",
    });
  }

  isRunning = true;

  // 第二個參數(shù)是數(shù)組,表示執(zhí)行哪個腳本,和傳給 Python 的參數(shù)
  const py = spawn(pythonPath, [scriptPath]);

  let error = "";

  py.stderr.on("data", (data) => {
    error += data.toString();
  });

  py.on("error", (err) => {
    console.error("啟動失敗:", err);
    isRunning = false;
    return res.send({
      status: 500,
      message: "Python 啟動失敗",
      error: err.message,
    });
  });
  // 超時殺進程
  const timeout = setTimeout(() => {
    py.kill("SIGTERM");
  }, 300000); // 300秒超時

  py.on("close", (code) => {
    clearTimeout(timeout);
    isRunning = false;
    if (code === 0) {
      return res.send({
        status: 200,
        message: "Python腳本執(zhí)行成功",
      });
    }

    console.error("Python執(zhí)行錯誤:", error);

    return res.send({
      status: 500,
      message: "Python執(zhí)行失敗",
      error: error || "未知錯誤",
    });
  });
};

每個請求都 spawn 一個 Python 進程,如果接口被并發(fā)打(比如前端連點多次請求、或者有壓測),就會同時起多個 python.exe 導致內存瞬間爆掉,所以這里限制了單進程:

①在腳本test.py里強制限制線程,放在所有import之前

import os
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["OMP_NUM_THREADS"] = "1"
os.environ["MKL_NUM_THREADS"] = "1"

②加單進程鎖(不允許并發(fā)執(zhí)行),以及加超時殺進程(防卡死)

同一時間只執(zhí)行一個 Python 腳本,后面的請求直接拒絕,在“單進程 + spawn 模式”下,只要 Python 進程正常退出,內存會被系統(tǒng)回收。

方法二:使用FastAPI(推薦)

用 Python 起一個 API 服務,Node 通過 HTTP 調用,穩(wěn)定性最高,避免:spawn 死鎖、buffer 溢出、JSON污染

Step1:進入虛擬環(huán)境安裝 FastAPI 和 uvicorn

cd python 
venv\Scripts\Activate.ps1
pip install fastapi "uvicorn[standard]"

Step2:Python 起 API 服務,新建入口文件 api_server.py

# api_server.py 
import os
from fastapi import FastAPI
import sys

# 關鍵:讓 python 能識別 scripts 目錄
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)
# 從 scripts 引入
from scripts.test import get_test_info   

app = FastAPI()
# 注冊路由:
@app.get("/aaa/bbb")
async def ccc():
    result = await get_test_info()
    return result

Step3:把腳本文件改成接口驅動模式的函數(shù)寫法

比如異步任務時 if __name__ == "__main__": 改成async 函數(shù) async def get_test_info(): 并return json:

return {
    "status": 200,
    "file": result_file
}

注意:FastAPI 本身已經運行在事件循環(huán)里,不能在腳本文件里 asyncio.run()

Step4:在不同端口啟動這個 FastAPI 應用實例:uvicorn api_server:app --host 0.0.0.0 --port 8000 --reload

Step5:不再 spawn,改成 axios 請求:

const axios = require("axios");
// 全局執(zhí)行鎖
let isRunning = false;

// 注意腳本文件里訪問文件時的路徑,要用絕對路徑
exports.get_info = async (req, res) => {
  if (isRunning) {
    return res.send({
      status: 429,
      message: "任務正在執(zhí)行中,請稍后再試",
    });
  }

  isRunning = true;

  try {
    const response = await axios.get(
      "http://127.0.0.1:8000/aaa/bbb",
      {
        timeout: 300000, // 5分鐘超時
      }
    );

    isRunning = false;
    
    return res.send({
      status: 200,
      message: "Python腳本執(zhí)行成功",
      data: response.data,
    });
  } catch (error) {
    isRunning = false;

    return res.send({
      status: 500,
      message: "FastAPI調用失敗",
      error: error.message,
    });
  }
};

到此這篇關于node項目中調用執(zhí)行python腳本的方法詳解的文章就介紹到這了,更多相關node調用python腳本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Nodejs進階:如何將圖片轉成datauri嵌入到網(wǎng)頁中去實例

    Nodejs進階:如何將圖片轉成datauri嵌入到網(wǎng)頁中去實例

    這篇文章主要介紹了Nodejs進階:如何將圖片轉成datauri嵌入到網(wǎng)頁中去,有興趣的可以了解一下。
    2016-11-11
  • 手把手帶你搭建一個node cli的方法示例

    手把手帶你搭建一個node cli的方法示例

    這篇文章主要介紹了手把手帶你搭建一個node cli的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Nodejs本地部署DeepSeek的教程詳解

    Nodejs本地部署DeepSeek的教程詳解

    DeepSeek作為一款開源且性能強大的大語言模型,提供了靈活的本地部署方案,讓用戶能夠在本地環(huán)境中高效運行模型,同時保護數(shù)據(jù)隱私,本文主要為大家詳細介紹了Nodejs本地部署DeepSeek的相關知識,需要的可以了解下
    2025-02-02
  • nodejs超出最大的調用棧錯誤問題

    nodejs超出最大的調用棧錯誤問題

    這篇文章主要介紹了nodejs超出最大的調用棧錯誤問題,需要的朋友可以參考下
    2017-12-12
  • Node快捷方式路徑的獲取方法

    Node快捷方式路徑的獲取方法

    本文介紹了兩種獲取Node.js快捷方式路徑的方法:通過nvm命令查看和手動查看nvm配置文件,獲取路徑后,需將其添加到系統(tǒng)Path環(huán)境變量中,以便終端識別node和npm命令,如果路徑下沒有node.exe文件,可以通過nvm使用特定版本重新切換以生成,需要的朋友可以參考下
    2026-03-03
  • 解決前端報錯“opensslErrorStack:?[?'error:03000086:digital?envelope?routines::initialization?error'?]”

    解決前端報錯“opensslErrorStack:?[?'error:03000086:digital?

    這篇文章主要介紹了前端報錯“opensslErrorStack:?[?'error:03000086:digital?envelope?routines::initialization?error'?]”的相關資料,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2026-05-05
  • node.js博客項目開發(fā)手記

    node.js博客項目開發(fā)手記

    本篇文章給大家總結了node.js博客項目開發(fā)的相關步驟以及知識點分享,有興趣的朋友參考下。
    2018-03-03
  • node.js中的buffer.toJSON方法使用說明

    node.js中的buffer.toJSON方法使用說明

    這篇文章主要介紹了node.js中的buffer.toJSON方法使用說明,本文介紹了buffer.toJSON的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • nodejs中express入門和基礎知識點學習

    nodejs中express入門和基礎知識點學習

    這篇文章給大家分享了關于學習nodejs中express入門和基礎知識點內容,有興趣的朋友們參考下。
    2018-09-09
  • nodejs發(fā)布靜態(tài)https服務器的方法

    nodejs發(fā)布靜態(tài)https服務器的方法

    這篇文章主要介紹了nodejs發(fā)布靜態(tài)https服務器的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

新蔡县| 天气| 临桂县| 双柏县| 吴忠市| 孟津县| 玉门市| 白沙| 乡宁县| 岱山县| 浦江县| 龙口市| 福州市| 庐江县| 聊城市| 新巴尔虎右旗| 马山县| 新昌县| 鄂托克旗| 台湾省| 城步| 平塘县| 利川市| 财经| 武定县| 烟台市| 庐江县| 皋兰县| 安吉县| 阳高县| 城步| 江门市| 台江县| 共和县| 吉安县| 磐石市| 太谷县| 昆山市| 清丰县| 阳泉市| 卓资县|