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

Python 如何在heroku上托管cython web应用程序?,python,heroku,flask,cython,Python,Heroku,Flask,Cython,目前,我正在玩Cython,并试图找出如何在heroku上托管Cython Flask应用程序(例如) 假设我的项目看起来像这样(在cython编译之后): 现在,app.pyx中有一个标准烧瓶应用程序,其中包含一些cython调整,如下所示: #cython: infer_types=True from flask import Flask app = Flask(__name__) @app.route('/', methods=['GET']) def index(): cde

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

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

现在,app.pyx中有一个标准烧瓶应用程序,其中包含一些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-iapp/app.pyx
编译我的app.pyx代码

run.py
文件中,我有:

from app.app import app

app.run()
从我的命令行
python run.py
启动它,当我看到
for
循环返回的值时,就会启动本地主机上的服务器

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

no module named app
据我所知,heroku根本看不到我编译的应用程序文件

UPD:
Procfile
中的命令:

web: gunicorn run:app --log-file=-
UPD2: 经过一些测试,我发现Heroku无法识别
app.cpython-36m-darwin.so
作为一个模块。这就是我犯错误的原因


现在的问题是–我如何让heroku识别
。因此
文件作为python模块?

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

假设我们的项目是这样的

_/cythonheroku
 |-- requirements.txt
 |-- Procfile
 |__/app
    |-- __init__.py
    |-- app.pyx
步骤如下:

  • 创建一个项目并将其推送到heroku,而无需使用cython编译
    .pyx
    文件
  • 您需要将堆栈设置为
    container
    ,并安装一些linux软件包。因此,基本上,您需要:
  • 删除您的
    Procfile
    并使用以下内容安装清单插件:

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

    setup:
      config: {}
    build:
      languages:
        - python
      packages:
        - build-essential
    run:
      web: 'gunicorn app.app:app'
    
    我们想安装
    build essential
    ,这样heroku端的linux机器就可以编译我们的cython代码了<代码>运行命令有点棘手–据我所知,您无法在heroku中正确运行cython应用程序,例如:

    from app.app import app
    app.run()
    
    Heroku会输入一个错误,该地址已经在使用中(出于某种原因,它会在本地运行你的应用程序,然后尝试启动你的web应用程序,你会收到一个错误。我不知道,我会尝试以某种方式修复此问题,但这并不是那么关键)

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

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

    heroku run bash
    
    然后,您需要使用以下简单方法编译代码:

    cythonize -i app/app.pyx
    
    现在,每个heroku dyno都有自己的临时文件系统,以及最新部署代码的新副本,因此编译后的文件根本不会保存。您需要将其下载到您的计算机上,添加到project并再次推送到heroku。您可以使用transfer.sh这样做:

    curl --upload-file ./app/<your-file> https://transfer.sh/<name-of-file>
    
    curl——上传文件。/app/https://transfer.sh/
    
    然后,您可以使用命令行中生成的链接下载它注意:您必须复制两个文件-
    .c
    .cpython-36m-x86\u 64-linux-gnu.so
    。因此
    文件可以用不同的名称命名,但您已经想到了

  • 将这两个文件添加到项目中,提交并推送到heroku

  • 就这样。您的应用程序将启动并在web上可用

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