You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一主机同用户下Python与JavaScript进程无网络通信方案咨询

可行的本地进程间通信方案

1. 共享文件(最简单实现)

原理:Python定期将数据写入本地文件,JavaScript进程轮询读取该文件,可通过文件修改时间或数据唯一标识避免重复处理。

Python 写入代码

import json
import time

# 定义共享文件路径,需确保同一用户有读写权限
SHARE_FILE = "/tmp/shared_data.json"

def send_periodic_data():
    while True:
        # 构造待发送数据
        data = {"timestamp": time.time(), "content": "来自Python的定期推送"}
        # 覆盖写入文件,保证数据为最新版本
        with open(SHARE_FILE, "w") as f:
            json.dump(data, f)
        # 每隔5秒发送一次
        time.sleep(5)

if __name__ == "__main__":
    send_periodic_data()

JavaScript 读取代码(Node.js环境)

const fs = require('fs');

const SHARE_FILE = '/tmp/shared_data.json';
let lastUpdateTime = 0;

function checkForUpdates() {
    fs.stat(SHARE_FILE, (err, stats) => {
        if (err) {
            console.error('获取文件状态失败:', err);
            setTimeout(checkForUpdates, 1000);
            return;
        }
        // 仅处理文件更新后的内容
        if (stats.mtime.getTime() > lastUpdateTime) {
            lastUpdateTime = stats.mtime.getTime();
            fs.readFile(SHARE_FILE, 'utf8', (err, rawData) => {
                if (!err) {
                    const data = JSON.parse(rawData);
                    console.log('收到数据:', data);
                }
            });
        }
        // 每秒轮询一次
        setTimeout(checkForUpdates, 1000);
    });
}

checkForUpdates();

2. 命名管道(FIFO,单向高效)

原理:利用操作系统提供的命名管道机制,Python作为写入端,JavaScript作为读取端,数据直接通过管道传输,无需磁盘存储。

Linux/macOS 实现

Python 写入端

import time
import os

# 定义管道路径
FIFO_PATH = "/tmp/python_js_fifo"

# 若管道不存在则创建
if not os.path.exists(FIFO_PATH):
    os.mkfifo(FIFO_PATH)

def send_via_fifo():
    # 以写入模式打开管道
    with open(FIFO_PATH, "w") as fifo:
        while True:
            data = f"Python推送数据: {time.time()}\n"
            fifo.write(data)
            fifo.flush()  # 强制写入管道,避免缓存
            time.sleep(5)

if __name__ == "__main__":
    send_via_fifo()

JavaScript 读取端(Node.js)

const fs = require('fs');

const FIFO_PATH = '/tmp/python_js_fifo';

// 以流模式读取管道内容
const fifoStream = fs.createReadStream(FIFO_PATH);

fifoStream.on('data', (chunk) => {
    const content = chunk.toString().trim();
    console.log('从管道收到:', content);
});

fifoStream.on('error', (err) => {
    console.error('管道读取错误:', err);
});

Windows 实现

只需将管道路径改为\\.\pipe\python_js_fifo,代码逻辑与上述一致。

3. 共享内存(大数据量场景首选)

原理:两个进程直接访问同一块内存区域,无需中间存储,传输效率最高。

Python 写入代码(使用mmap模块)

import mmap
import time
import json

SHARE_MEM_FILE = "/tmp/shared_memory"
MEM_SIZE = 4096  # 定义共享内存大小(4KB)

# 初始化共享内存文件
with open(SHARE_MEM_FILE, "wb") as f:
    f.write(b'\x00' * MEM_SIZE)

def send_via_shared_mem():
    with open(SHARE_MEM_FILE, "r+b") as f:
        # 映射内存区域
        mm = mmap.mmap(f.fileno(), MEM_SIZE, access=mmap.ACCESS_WRITE)
        while True:
            data = json.dumps({"time": time.time(), "msg": "共享内存数据"}).encode('utf8')
            # 清空内存区域
            mm.seek(0)
            mm.write(b'\x00' * MEM_SIZE)
            # 写入新数据
            mm.seek(0)
            mm.write(data)
            mm.flush()
            time.sleep(5)

if __name__ == "__main__":
    send_via_shared_mem()

JavaScript 读取代码(Node.js 使用mmap-io包)

先安装依赖:npm install mmap-io

const mmap = require('mmap-io');
const fs = require('fs');

const SHARE_MEM_FILE = '/tmp/shared_memory';
const MEM_SIZE = 4096;

const fd = fs.openSync(SHARE_MEM_FILE, 'r+');
const buffer = mmap.map(MEM_SIZE, mmap.PROT_READ, mmap.MAP_SHARED, fd);

function readSharedMem() {
    // 读取内存直到遇到空字符
    let content = '';
    for (let i = 0; i < MEM_SIZE; i++) {
        if (buffer[i] === 0) break;
        content += String.fromCharCode(buffer[i]);
    }
    if (content) {
        const data = JSON.parse(content);
        console.log('共享内存收到:', data);
    }
    setTimeout(readSharedMem, 1000);
}

readSharedMem();

内容的提问来源于stack exchange,提问作者zkeohfotyerxfcltel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:15:34