如何在 Google Cloud Functions 上运行 cython 共享库?



正如标题所说,我想知道谷歌云函数(我目前有一些纯python代码(是否支持cython'd模块?

我想,更具体地说,我在问我将如何使用上述模块?这是一个私人项目,我通过setup.py和cythonize(files)使用cython,它创建了一组共享对象模块(example.cpython-38-darwin.soexample1.cpython-38-darwin.soexample2.cpython-38-darwin.so(。

这些都是针对Mac的,所以在Firebase上不起作用。

有没有办法让Cloud函数运行setup.py并编译一些文件?或者,更好的是,是否有一些方法可以为适当的操作系统预编译这些文件,并只部署共享库?

我知道我通过pip在云函数上安装的各种库都在幕后使用Cython,但我真的不知道创建轮子或其他pip依赖关系的过程。。。

您需要通过添加pyproject.toml文件来指定cython作为私有项目的构建时依赖项,如:

[build-system]
requires = ["cython"]

然后,当在Cloud Functions运行时中使用现代版本的pip安装包时,cython将在运行setup.py脚本之前安装到构建环境中。

我似乎已经能够(最终(解决这个问题。。。我可能有几个不必要的步骤,但我认为它们改进了我的整体构建系统(同样,目的是能够在Firebase上使用cython'd共享库(。

从Docker(或者在我的情况下,Linux虚拟机(,在我的私人回购中,我cythonize重要的代码,并将一切变成一个轮子。从这里开始,我在轮子上运行auditwheel show,以检查它是否符合manylinux1标签(或我想要的任何manylinux(。在这种情况下,它确实一开始就遵守了manylinux1,所以这次没有必要修理车轮或做任何恶作剧。

... .py # Other irrelevant .py files
magic.py # Source code that needs to be cython'd
setup.py

简化的设置.py:

from setuptools import setup, find_packages
from Cython.Build import cythonize
setup(
    name='magiclib',
    version='0.1.0',
    packages=find_packages(),
    ext_modules=cythonize(
        "magic.py",
        compiler_directives={'language_level': 3}
    )
)

运行python setup.py bdist_wheel会创建一个名为dist/magiclib-0.1.0-cp37-cp37m-linux_x86_64.whl 的轮子

从这里开始,我运行auditwheel show dist/magiclib-0.1.0-cp37-cp37m-linux_x86_64.whl,这表明代码已经遵守了manylinux1标记,但我仍然运行创建wheelhouse/magiclib-0.1.0-cp37-cp37m-manylinux1_x86_64.whlauditwheel repair dist/magiclib-0.1.0-cp37-cp37m-linux_x86_64.whl

在这一点上,我把这个轮子带到我的GCF项目中,并使用:pip install -t magiclib magiclib-0.1.0-cp37-cp37m-manylinux1_x86_64.whl

它基本上将轮子解压缩到一个子目录中,我可以提供并部署到谷歌云,并从我的函数调用它。

在我的一些简单代码上运行良好,我将尝试一些更复杂的代码。

相关内容

  • 没有找到相关文章

最新更新