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

Firefox扩展Native Messaging调用Python时出现nltk模块未找到错误

Firefox扩展Native Messaging Python依赖包找不到问题

问题现象

开发Firefox扩展通过Native Messaging实现JavaScript与Python数据交互时,浏览器控制台持续报错:

stderr output from native app classifier: ModuleNotFoundError: No module named 'nltk'
  • 已在PyCharm虚拟环境中安装nltk,希望在原生消息脚本中用其处理文本
  • sys、json、struct等内置包无报错,pandas可正常导入,但nltk、keras导入失败
  • 移除nltk导入语句后,Native Messaging可正常工作

相关代码

Python脚本(send_recieve_info.py)

import sys
import json
import struct
import nltk


class Informationtransmission:

    def getMessage(self):
        rawLength = sys.stdin.buffer.read(4)
        if len(rawLength) == 0:
            sys.exit(0)
        messageLength = struct.unpack('@I', rawLength)[0]
        message = sys.stdin.buffer.read(messageLength).decode('utf-8')
        return json.loads(message)

    def encodeMessage(self, messageContent):
        encodedContent = json.dumps(messageContent).encode('utf-8')
        encodedLength = struct.pack('@I', len(encodedContent))
        return {'length': encodedLength, 'content': encodedContent}

    def sendMessage(self, encodedMessage):
        sys.stdout.buffer.write(encodedMessage['length'])
        sys.stdout.buffer.write(encodedMessage['content'])
        sys.stdout.buffer.flush()

x = Informationtransmission()
receivedMessage = x.getMessage()

if receivedMessage:
    x.sendMessage(x.encodeMessage(receivedMessage))

JavaScript文件(popup.js)

function logTabs(tabs) {
    let tab = tabs[0];

    port.postMessage(tab.url);
}

function listTabs() {
    browser.tabs.query({currentWindow: true, active: true}).then(logTabs, console.error);
}

let port = browser.runtime.connectNative("classifier");

document.addEventListener("click", (e) => {
    if (e.target.id === "url") {
        listTabs();
    }
})

port.onMessage.addListener((response) => {
    console.log("Received: " + response);
});

扩展清单(manifest.json)

{
    "browser_specific_settings": {
        "gecko": {
            "id": "test@example.org",
          "strict_min_version": "58.0a1"
        }
    },

    "manifest_version": 2,
    "name": "classifier",
    "version": "1.0",

    "description": "Classifies",

    "background": {
        "scripts": ["popup.js"]
    },

    "browser_action":{
        "browser_style": true,
        "default_icon":{
            "48":"/icon.svg"
        },
        "default_title":"classifier",
        "default_popup":"/popup.html"
    },

    "permissions": [
        "tabs",
        "activeTab",
        "scripting",
        "nativeMessaging"
    ]
}

原生应用启动脚本(calltoscript.bat)

@echo off

call python -u "E:\proj\send_recieve_info.py"

原生应用配置文件(classifier.json)

{
  "name": "classifier",
  "description": "host for native messaging",
  "path": "E:\\proj\\calltoscript.bat",
  "type": "stdio",
  "allowed_extensions": ["test@example.org"]
}

解决方案

问题根源:Firefox调用原生应用时使用系统默认的Python环境,而非PyCharm的虚拟环境,导致虚拟环境中安装的包无法被找到。

方法1:直接使用虚拟环境Python解释器的绝对路径

找到PyCharm虚拟环境中python.exe的路径(通常在虚拟环境目录的Scripts文件夹下,如E:\proj\venv\Scripts\python.exe),修改bat文件:

@echo off
call "E:\proj\venv\Scripts\python.exe" -u "E:\proj\send_recieve_info.py"

方法2:先激活虚拟环境再执行脚本

在bat文件中先激活虚拟环境,确保后续Python命令使用虚拟环境的解释器:

@echo off
call "E:\proj\venv\Scripts\activate.bat"
python -u "E:\proj\send_recieve_info.py"

方法3:验证环境路径(用于排查)

在Python脚本开头添加以下代码,打印当前Python环境的包搜索路径,确认是否包含虚拟环境的site-packages目录:

import sys
print(sys.path)

运行后查看浏览器控制台的stderr输出,若路径中没有虚拟环境的包目录,说明环境未正确切换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:10:27