【问题标题】:How to host cython web app on heroku?如何在 heroku 上托管 cython 网络应用程序?
【发布时间】:2019-01-10 07:23:20
【问题描述】:

目前,我正在玩 Cython,并试图弄清楚如何在 heroku 上托管 Cython Flask 应用程序(例如)。

假设我的项目看起来像这样(在 cython 编译之后):

_/cythonheroku
 |-- requirements.txt
 |-- run.py
 |-- Procfile
 |__/app
    |-- __init__.py
    |-- app.c
    |-- app.cpython-36m-darwin.so
    |-- app.pyx

现在,app.pyx 中有一个标准的 Flask 应用,其中包含一些 cython 调整,如下所示:

#cython: infer_types=True
from flask import Flask

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
    cdef long x = 10000000
    cdef long long y = 0
    cdef int i
    for i in range(x):
        y += i
    return str(y)

然后,使用命令 cythonize -i app/app.pyx 编译我的 app.pyx 代码。

run.py 文件中我有:

from app.app import app

app.run()

当我看到来自for 循环的返回值时,从我的命令行python run.py 启动它会在本地主机上启动一个服务器。

问题: 将其推送到 heroku 后,我在 run.py 的第一行得到错误:

no module named app

据我所知——heroku 只是看不到我编译的应用程序文件。

UPD:Procfile 中的命令:

web: gunicorn run:app --log-file=-

UPD2: 经过一些测试,我发现 Heroku 无法将 app.cpython-36m-darwin.so 识别为模块。这就是我收到该错误的原因。

现在的问题是 – 如何让 heroku 将 .so 文件识别为 python 模块?

【问题讨论】:

    标签: python heroku flask cython


    【解决方案1】:

    好的,我设法找到了解决方案。

    假设我们的项目是这样的

    _/cythonheroku
     |-- requirements.txt
     |-- Procfile
     |__/app
        |-- __init__.py
        |-- app.pyx
    

    步骤如下:

    1. 创建一个项目并将其推送到heroku 无需使用cython 编译.pyx 文件
    2. 您需要将您的堆栈设置为container 并安装一些Linux 软件包。所以,基本上,你需要:
    3. 删除您的 Procfile 并安装清单插件:

      heroku update beta
      heroku plugins:install @heroku-cli/plugin-manifest
      heroku manifest:create
      
    4. 在创建的heroku.yml 中,您需要指定包并运行命令。最小可行清单文件如下所示:

      setup:
        config: {}
      build:
        languages:
          - python
        packages:
          - build-essential
      run:
        web: 'gunicorn app.app:app'
      

      我们要安装build-essential,这样heroku 端的linux 机器就可以编译我们的cython 代码。 run 命令有点棘手 - 据我了解,您无法在 heroku 中正确运行您的 cython 应用程序,例如:

      from app.app import app
      app.run()
      

      Heroku 会出错,该地址已在使用中(出于某种原因,它会在本地运行您的应用程序,然后尝试启动您的网络应用程序,您会收到错误消息。我不知道,我会尝试以某种方式解决此问题,但 atm 并不是那么关键)。

    5. 将堆栈更改为容器并推送:

      heroku stack:set container
      git push heroku master
      
    6. 你会在终端看到很多东西。没关系。 Heroku 将尝试使用heroku.yml 中指定的命令运行您的应用程序,您将收到错误消息。那是因为我们还没有 cython 文件。现在,问题是每个操作系统的编译文件都是唯一的,我猜,每台机器(取决于我认为的 CPU 芯片组)。 这就是为什么我们要在heroku 端而不是本地 上编译我们的文件。为此,您需要连接到 heroku 终端,只需键入:

      heroku run bash
      

      然后你需要用 simple 编译你的代码:

      cythonize -i app/app.pyx
      

      现在,每个 heroku dyno 都有自己的临时文件系统,以及最近部署的代码的新副本,因此您的编译文件根本不会保存。您需要在您的机器上下载它,添加到项目并再次推送到 heroku。你可以像这样使用 transfer.sh 来做到这一点:

      curl --upload-file ./app/<your-file> https://transfer.sh/<name-of-file>
      

      然后就可以用命令行生成的链接下载了。 注意:您必须复制 2 个文件 — &lt;file&gt;.c&lt;file&gt;.cpython-36m-x86_64-linux-gnu.so.so 文件可以命名不同,但你明白了。

    7. 将这两个文件添加到您的项目中,提交并推送到heroku。

    8. 就是这样。您的应用程序将启动并在网络中可用。

    http://cython.herokuapp.com/

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2011-05-10
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2018-12-04
      相关资源
      最近更新 更多