我如何 运行 在 Google Cloud Functions 上使用 cython 共享库?
How can I run cython'd shared libraries on Google Cloud Functions?
正如标题所说,我想知道 Google Cloud Functions(我目前有一些纯 python 代码)是否支持 cython 模块?
我想,更具体地说,我是在问我将如何使用所述模块?这是一个私人项目,我通过 setup.py 和 cythonize(files)
使用 cython,它创建了一堆共享 object 模块(example.cpython-38-darwin.so
、example1.cpython-38-darwin.so
、example2.cpython-38-darwin.so
).
这些都适用于 Mac,因此不适用于 Firebase。
有什么方法可以让 Cloud Functions 进入 运行 和 setup.py 并编译一些文件吗?或者,更好的是,是否有某种方法可以 pre-compile 那些文件以获得适当的 OS 并仅部署共享库?
我知道我通过 pip
在 Cloud Functions 上安装的各种库在后台使用 Cython,但我真的不知道创建 wheel 或其他 pip 依赖项的过程...
您需要通过添加 pyproject.toml
文件将 cython
指定为私有项目的构建时依赖项,例如:
[build-system]
requires = ["cython"]
然后当你在 Cloud Functions 运行 中使用现代版本 pip
安装你的包时,cython
将在你的 setup.py
之前安装到构建环境中脚本是 运行.
我似乎已经(最终)解决了这个问题...我可能有几个不必要的步骤,但我认为它们改进了我的整体构建系统(同样,目的是能够使用 cython'd Firebase 上的共享库)。
来自 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
简化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 云并从我的函数中调用。
我的一些简单代码运行良好,我将尝试一些更复杂的代码。
正如标题所说,我想知道 Google Cloud Functions(我目前有一些纯 python 代码)是否支持 cython 模块?
我想,更具体地说,我是在问我将如何使用所述模块?这是一个私人项目,我通过 setup.py 和 cythonize(files)
使用 cython,它创建了一堆共享 object 模块(example.cpython-38-darwin.so
、example1.cpython-38-darwin.so
、example2.cpython-38-darwin.so
).
这些都适用于 Mac,因此不适用于 Firebase。
有什么方法可以让 Cloud Functions 进入 运行 和 setup.py 并编译一些文件吗?或者,更好的是,是否有某种方法可以 pre-compile 那些文件以获得适当的 OS 并仅部署共享库?
我知道我通过 pip
在 Cloud Functions 上安装的各种库在后台使用 Cython,但我真的不知道创建 wheel 或其他 pip 依赖项的过程...
您需要通过添加 pyproject.toml
文件将 cython
指定为私有项目的构建时依赖项,例如:
[build-system]
requires = ["cython"]
然后当你在 Cloud Functions 运行 中使用现代版本 pip
安装你的包时,cython
将在你的 setup.py
之前安装到构建环境中脚本是 运行.
我似乎已经(最终)解决了这个问题...我可能有几个不必要的步骤,但我认为它们改进了我的整体构建系统(同样,目的是能够使用 cython'd Firebase 上的共享库)。
来自 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
简化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 云并从我的函数中调用。
我的一些简单代码运行良好,我将尝试一些更复杂的代码。