python - 部署具有所有包依赖项的 Python Cloud Function

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

我想部署一个不依赖于使用 requirements.txt 来安装包的云函数。我希望这些包在存储中可用,或者作为功能的一部分压缩和上传。这可能吗?

编辑 2019 年 6 月 14 日

基本上,我想用我的代码发送像 numpy 和 pandas 这样的包来部署云函数。如果 pypi.org 不可用,我想这样做。我试过关注这篇 documentation .下面是我正在尝试做的一个例子:

文件夹结构:

-> my_folder
    -> main.py
    -> libs
        -> numpy (the entire package)
        -> pandas (the entire package)
        -> __init__.py

主.py

import libs.numpy as np
import libs.pandas as pd

def function()
    do stuff with numpy and pandas

然后我尝试从 gcloud 命令行和 gcp UI 部署该功能,但都失败了。如果可能,请提供帮助。

最佳答案

目前只有两个选择:

  1. 使用requirements.txt
  2. 将依赖项与您的函数一起打包,link here

它们既不能压缩也不能存储,它们将被视为函数源的一部分。

如果您选择第二个选项,参数 -t libs 可能会对您有所帮助。 您可以使用它在 libs 文件夹中安装所有内容,然后您可以将内容移动到本地目录。作为单个命令,它看起来像这样:

pip install -t libs [your library name(s)] && rm -rf libs/*.dist-info && mv -r libs/* . && rm -rf libs

我添加了 rm -rf libs/*.dist-info 部分,以免源文件夹中出现大量对函数无用的库版本和分发信息。 pip 在卡住和计划更新时使用它们。

编辑 2019 年 6 月 14 日

您将库保存在 libs 文件夹中。这就是我在上面添加的单行上的 mv -r libs/* . 之前的点。

使用 libs 文件夹可以让一切更有条理,所以如果你想把包放在那里,你需要供应那个文件夹,将它添加到你的 main.py,在所有其他导入之前:

# Vendoring packages from libs folder
import sys
import os
sys.path.insert(1, os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    "libs"
))
# All other imports go below this line

解释:

__file__ 是存在于每个模块中的全局变量,它保存定义模块的文件的路径,也就是使用它的文件。在我们的例子中,main.py 的路径。

由于在导入 main.py 时我们无法确定工作目录,我们将其传递给 os.path.realpath 以确定路径结构.可能是 os.path.abspath,我已经看到并使用了两者,但没有发现任何区别。

从文件的路径中,我们通过 os.path.dirname 获取您的源代码目录的路径,然后通过 libs 获取其中的文件夹os.path.join.

现在是最重要的部分。当您尝试导入包时,python 会在 system/python 路径上查找它们。因此,我们将构建的libs 完整路径添加为系统路径上的第一个查找位置在您的工作目录之后。新的 import 语句将首先查找该文件夹,如果包不存在,则继续正常查找其余目录。
如果您希望仅在系统和 python 环境中不可用时才在 libs 上查找包,请附加 libs 路径,而不是将其插入索引 1。

之后你不需要在你的导入中添加libs.,只需使用普通的import numpy

在完全独立的包上这可能有效,但在有依赖的包上不行,因为他们希望它们的依赖可以直接导入(从 sys.path 上的任何地方)。

关于python - 部署具有所有包依赖项的 Python Cloud Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56546098/

相关文章:

python - 如何让 matplotlib 在 AWS EMR Jupyter notebook 中工作?

python - 为什么 Django 会收到长 url 锁 python 的请求?

python - 无法在启动期间获得 os.getenv ('HOSTNAME' ) 工作

javascript - 错误解析触发器 : Cannot find module

firebase - 为什么云函数 URL (Firebase) 可以公开访问?如何限制访问特定的外部调用?

python - 在 Pandas 中,如何将字符串转换为带毫秒的 datetime 对象?

google-cloud-platform - 尝试注册免费试用

google-cloud-platform - Cloud Run 是否需要 NGINX?

google-cloud-platform - 空闲 Kubernetes 集群上的高内存消耗

Firebase 托管的云函数重试任何需要 60 秒的请求,即使超时> 60 秒