如何在 Heroku 上 运行 一次性 python 脚本

How to run one-off python script on Heroku

我有一个 Django 应用程序,运行正在 Heroku 上运行。我想要 运行 一个名为 import.py 的简单脚本,它将 CSV 文件导入到我的模型中。它在我的本地计算机上运行良好。当我尝试使用此命令 运行 Heroku 上的脚本时:

heroku run python manage.py < import.py

它所做的只是将脚本读回给我,但不执行任何内容。我做错了什么?

编辑:

这是我在 运行 时得到的结果的开始:heroku 运行 python manage.py < import.py

Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import csv
>>> from bah_api.models import withDependents, withOutDependents, ZipMHA
>>> 
>>> # Populate CSV file into model
>>> def LoadCSV(file_location, my_model, delim):
... f = open(file_location)
  File "<console>", line 2
    f = open(file_location)
    ^
IndentationError: expected an indented block
>>> csv_f = csv.reader(f, delimiter=delim)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'f' is not defined
>>> for row in csv_f:
... 
Display all 182 possibilities? (y or n)

为 import.py 编写自定义 management command,然后 运行 heroku run python manage.py import.py

我认为您应该为此创建命令。命令应放在项目的 app/management/commands 目录中。如果此目录不存在,请创建它。脚本的名称是您的命令的名称,因此您应该将其命名为 import.py(错误的名称...)。必须做的另一件事是在 'management' 和 'commands' 目录中创建 __init__.py 文件,因为这些必须是 Python 包。 树应该是这样的:

app
├── admin.py
├── __init__.py
├── management
│   ├── commands
│   │   ├── __init__.py
│   │   └── import.py
│   └── __init__.py
├── models.py
... other files

现在你应该可以做这样的事情了: python manage.py import(真是个糟糕的名字...)

heroku run python manage.py import 将与 heroku 一起工作。

P.S。我不知道它是否适用于名称 'import'

可以使用django-extensionsrunscript command。此命令允许您通过 manage.py:

在 Django 上下文中 运行 python 脚本
python manage.py runscript my_script

要使用 Heroku 执行此操作:

  1. 安装 django-extensions 并确保它在您的 requirements.txt
    • pip install django-extensions
    • pip freeze > requirements.txt
  2. 创建 scripts 目录,如 documentation
  3. 中所述
  4. 部署到 Heroku
  5. 运行 它在 Heroku 上 heroku run
    • heroku run python manage.py runscript my_script
    • 注意:不要在上面的命令中将 .py 附加到您的脚本名称中

然后开始吧!