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

新手求助:如何在Heroku平台运行带参数的Python命令行工具

嘿,作为曾经在Heroku上折腾过命令行工具的人,我来给你梳理几个可行的方案,帮你解决这个问题!

方案1:直接运行命令行工具(无需Web应用)

你可能不知道,Heroku并不只支持Web应用——它可以运行各种类型的进程,包括纯命令行的worker进程。完全不用额外套Web服务的壳子,步骤很简单:

  1. 配置Procfile:在项目根目录创建一个名为Procfile的文件(注意首字母大写,无后缀),内容指定你的命令行进程:

    worker: python your_script.py
    

    如果你的脚本需要固定参数,直接加在后面就行:

    worker: python your_script.py --mode production --input data.csv
    
  2. 动态传参的处理:如果需要灵活传参,推荐用Heroku的环境变量:

    • 先在Procfile里引用环境变量:
      worker: python your_script.py --arg $MY_ARG
      
    • 然后通过Heroku CLI设置变量:
      heroku config:set MY_ARG="your_dynamic_value"
      
  3. 启动worker进程:部署后,默认Heroku只会启动web进程,所以你需要手动开启worker:

    heroku ps:scale worker=1
    

    之后这个worker进程就会一直运行(除非你停止它),如果是一次性任务,运行完可以把worker缩成0:heroku ps:scale worker=0

方案2:用Web服务封装(适合外部触发/动态传参)

如果你的需求是要通过外部请求(比如API调用)来触发脚本并传参,那套个轻量的Web服务是个好选择,用Flask或FastAPI都很方便:

举个Flask的简单例子:

import os
from flask import Flask, request, jsonify
import subprocess

app = Flask(__name__)

# 可以加个简单的API密钥认证,避免被随便调用
API_KEY = os.environ.get('API_KEY')

@app.route('/run-script', methods=['POST'])
def run_script():
    # 验证API密钥
    if request.headers.get('X-API-KEY') != API_KEY:
        return jsonify({'error': 'Unauthorized'}), 401
    
    # 获取请求里的参数
    script_args = request.json.get('args', [])
    # 安全调用脚本(用列表传参避免命令注入)
    result = subprocess.run(
        ['python', 'your_script.py'] + script_args,
        capture_output=True,
        text=True
    )
    
    return jsonify({
        'stdout': result.stdout,
        'stderr': result.stderr,
        'returncode': result.returncode
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 5000)))

然后配置Procfile启动Web服务:

web: gunicorn app:app

部署后,你就可以通过POST请求(比如用curl)传参数调用脚本了:

curl -X POST https://your-heroku-app.herokuapp.com/run-script \
  -H "X-API-KEY: your-secret-key" \
  -H "Content-Type: application/json" \
  -d '{"args": ["--input", "test.txt", "--output", "result.txt"]}'
要不要分开部署?

这个取决于你的使用场景:

  • 如果命令行工具是长时间运行的服务(比如监听消息队列),或者和Web服务的资源需求差异大,那分开部署成两个独立的Heroku应用更合适,方便分别缩放资源和管理。
  • 如果只是偶尔通过Web触发脚本,合在一起部署更简单,减少维护成本。
额外小Tips
  • 如果是周期性任务(比如每天跑一次脚本),可以用Heroku Scheduler插件,不用一直开worker进程,更省钱。
  • 调试的时候用heroku logs --tail实时查看脚本的输出和错误信息。
  • 记得把所有依赖写在requirements.txt里,Heroku会自动安装。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:50:08