正如标题所说,我想知道谷歌云函数(我目前有一些纯python代码(是否支持cython'd模块?
我想,更具体地说,我在问我将如何使用上述模块?这是一个私人项目,我通过setup.py和cythonize(files)
使用cython,它创建了一组共享对象模块(example.cpython-38-darwin.so
、example1.cpython-38-darwin.so
、example2.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.whl
的auditwheel 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
它基本上将轮子解压缩到一个子目录中,我可以提供并部署到谷歌云,并从我的函数调用它。
在我的一些简单代码上运行良好,我将尝试一些更复杂的代码。