【问题标题】:How can I run cython'd shared libraries on Google Cloud Functions?如何在 Google Cloud Functions 上运行 cython 的共享库?
【发布时间】:2023-03-19 09:45:01
【问题描述】:

正如标题所说,我想知道 Google Cloud Functions(我目前有一些纯 python 代码)是否支持 cython'd 模块?

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

这些都适用于 Mac,因此不适用于 Firebase。

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

我知道我通过 pip 在 Cloud Functions 上安装的各种库在后台使用 Cython,但我真的不知道创建轮子或其他 pip 依赖项的过程...

【问题讨论】:

    标签: python google-cloud-platform google-cloud-functions cython


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以,请稍微澄清一下...我无法上传预 cython 的文件,但我可以让 Google Cloud 在私有项目上执行构建过程?这让我觉得我需要在本地安装它们,然后上传它们:cloud.google.com/functions/docs/writing/…
    • 安装程序 pip 负责安装构建时依赖项,然后使用它们构建常规依赖项。这是整个 Python 生态系统的标准,不仅适用于 Cloud Functions,请参阅 PEP 518
    • 您也可以尝试预先构建您的依赖项并安装它,但这需要 a) 在与 Cloud Functions 运行时相同的平台上构建发行版,b) 在某处托管构建的发行版外部但可公开访问,Cloud Functions 可以访问它们 c) 修改您的 requirements.txt 文件以改为指向这些依赖项。还有很多工作。
    • “私人项目”到底是什么意思?这是外部托管的源代码分发?您的 Cloud Function 使用的模块?这里有很多可能性,包括一些示例代码会有所帮助。
    • “私有”意味着不对世界开源。归我的客户所有,但我确实可以访问上述来源。在理想情况下,文件将由 cython 预先编译(通过在与 Cloud Functions 运行时相同的平台上构建),并在我部署我的云函数时上传共享库。
    【解决方案2】:

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

    来自 Docker(或者在我的情况下是 Linux VM),在我的私人仓库中,我cythonize 重要的代码,然后把所有东西都变成了一个轮子。从这里,我在方向盘上运行auditwheel show,以检查它是否符合manylinux1 标签(或我想要的任何manylinux)。在这种情况下,它确实坚持manylinux1,所以这次不需要修理轮子或做任何恶作剧。

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

    简化 setup.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 标签,但我仍然运行auditwheel repair dist/magiclib-0.1.0-cp37-cp37m-linux_x86_64.whl,它创建wheelhouse/magiclib-0.1.0-cp37-cp37m-manylinux1_x86_64.whl

    此时,我将这个轮子带入我的 GCF 项目,并使用: pip install -t magiclib magiclib-0.1.0-cp37-cp37m-manylinux1_x86_64.whl

    这基本上将轮子解压缩到一个子目录中,我可以将其供应并部署到 Google Cloud 并从我的 Functions 中调用。

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2017-03-24
      • 2018-12-25
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2020-11-03
      • 2014-06-13
      相关资源
      最近更新 更多