部署Firebase Node.js函数调用Python脚本遇ModuleNotFoundError问题
解决Firebase Functions调用Python脚本找不到rembg模块的问题
核心问题分析
你用Node.js的PythonShell调用Python脚本时,Firebase默认不会自动处理Python依赖(requirements.txt仅对Python类型的Function生效),且云端环境的Python路径和依赖位置需要明确指定。
具体解决步骤
1. 确认requirements.txt的正确性
- 确保文件和
app.py、index.js在同一个functions目录下 - 文件内容必须包含
rembg,如果需要指定版本可以写:rembg==2.0.53 # 若rembg依赖其他包(如torch),也需要一并列出,比如: torch==2.0.1
2. 部署前自动安装Python依赖
云端环境每次部署都会重置,手动在GCP Shell安装的依赖不会保留,必须通过部署脚本自动安装:
- 在
functions/package.json的scripts中添加预处理命令:"scripts": { "predeploy": "pip3 install -r requirements.txt --target=./.python_env", "deploy": "firebase deploy --only functions" } - 之后用
npm run deploy命令部署,而非直接firebase deploy,这样会先把依赖安装到functions/.python_env目录下
3. 调整PythonShell的调用参数
在index.js中调用PythonShell时,指定Python3路径并配置依赖查找路径:
const { PythonShell } = require('python-shell'); const runPythonScript = async () => { const options = { // 指定云端的Python3路径 pythonPath: '/usr/bin/python3', // 设置PYTHONPATH指向我们安装的依赖目录(替换成实际的Python版本,比如3.9) env: { PYTHONPATH: `${__dirname}/.python_env/lib/python3.9/site-packages` } }; return new Promise((resolve, reject) => { PythonShell.run('app.py', options, (err, results) => { if (err) reject(err); resolve(results); }); }); };
4. 备选:在Python脚本中手动添加依赖路径
如果上面的环境变量配置不生效,可以在app.py开头添加:
import sys # 替换成实际的依赖安装路径,可通过部署后在GCP日志打印sys.path确认 sys.path.append('./.python_env/lib/python3.9/site-packages') # 之后再导入rembg from rembg import remove
5. 验证云端Python版本
可以在函数中添加调试代码,打印当前Python版本和路径,确认依赖安装路径是否匹配:
在index.js中添加:
const { execSync } = require('child_process'); console.log('Python3版本:', execSync('/usr/bin/python3 --version').toString()); console.log('Python3 site-packages路径:', execSync('/usr/bin/python3 -c "import site; print(site.getsitepackages())"').toString());
部署后查看GCP控制台日志,得到实际的site-packages路径,再调整上面的配置
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

