gpt4 book ai didi

python - 如何在 heroku 上托管 cython web 应用程序?

转载 作者:太空狗 更新时间:2023-10-29 21:41:25 25 4
gpt4 key购买 nike

目前我正在玩 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 模块?

最佳答案

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

假设我们的项目看起来像这样

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

步骤如下:

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

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

    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

    然后你需要简单的编译你的代码:

    cythonize -i app/app.pyx

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

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

    然后您可以使用命令行中生成的链接下载它。 注意:您必须复制 2 个文件 — <file>.c<file>.cpython-36m-x86_64-linux-gnu.so . .so文件可以以不同的方式命名,但您明白了。

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

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

http://cython.herokuapp.com/

关于python - 如何在 heroku 上托管 cython web 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51655018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com