部署在Heroku的Node.js应用调用Python脚本失败求助
Hey there, let's work through this problem together—you're not alone with Heroku's multi-language deployment quirks! Here's a step-by-step breakdown of what's going wrong and how to fix it:
1. The Root Cause: Heroku Isn't Installing Python Dependencies
When you deploy a Node.js app to Heroku, it only looks at your package.json by default—it has no idea you need Python dependencies unless you explicitly tell it to. That's why your requirements.txt was being ignored, leading to failed imports of spacy and nltk.
Fix: Add Dual Buildpacks
You need to configure Heroku to handle both Node.js and Python. Here's how (make sure you're logged into the Heroku CLI first):
# Add Python buildpack first (so dependencies install before Node.js) heroku buildpacks:add --index 1 heroku/python # Then add Node.js buildpack heroku buildpacks:add --index 2 heroku/nodejs
This tells Heroku to process your requirements.txt first, then set up your Node.js environment.
2. Fix Your requirements.txt for Spacy & NLTK
Just listing spacy and nltk isn't enough—Spacy requires language models, and NLTK needs pre-downloaded corpora to work properly. Here's how to set this up:
First, lock your package versions in requirements.txt to avoid compatibility surprises:
spacy==3.5.3 nltk==3.8.1
Next, create a setup.py file in your root directory to handle pre-downloading necessary data during the build phase:
import nltk import spacy # Download NLTK corpora your script uses (adjust based on your actual needs) nltk.download(['punkt', 'wordnet', 'averaged_perceptron_tagger']) # Download a lightweight Spacy model (use the exact one your script relies on) spacy.cli.download("en_core_web_sm")
Then add this line to the bottom of your requirements.txt to trigger the setup script during deployment:
-e .
This ensures all NLTK corpora and Spacy models are ready before your app starts running, avoiding runtime failures.
3. Resolve the R14 Memory Quota Error
The R14 error is a side effect of your Node.js app hanging while waiting for the Python script to finish (since the script crashes immediately from missing dependencies). Once you fix the dependency issues, the script should run properly and exit, freeing up memory.
If you still hit memory limits after fixing dependencies:
- Stick to lightweight Spacy models (like
en_core_web_sminstead of heavier options likeen_core_web_lg) - Optimize your Python script to avoid loading unnecessary data into memory
- Double-check that your Node.js app isn't holding onto resources unnecessarily while waiting for the script output
4. Debugging Tips for Future Issues
- Use
heroku logs --tailin your terminal to watch logs in real-time—this will show you exactly why the Python script is crashing, not just that it is - Add detailed error handling in your Python script to capture and print full stack traces:
This will make it way easier to spot missing dependencies or configuration issues in Heroku's logs.import traceback try: import spacy import nltk # Rest of your script logic except Exception as e: print(f"Error during setup: {str(e)}") traceback.print_exc() exit(1)
内容的提问来源于stack exchange,提问作者Max Kenney

