部署具有所有包依赖项的 Python 云函数

not*_*ist 3 python google-cloud-platform google-cloud-functions

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

编辑 6/14/2019

基本上我想用我的代码发送像 numpy 和 pandas 这样的包来部署云功能。如果 pypi.org 不可用,我想这样做。我试过按照这篇文档进行操作。我正在尝试做的一个例子如下:

文件夹结构:

-> my_folder
    -> main.py
    -> libs
        -> numpy (the entire package)
        -> pandas (the entire package)
        -> __init__.py
Run Code Online (Sandbox Code Playgroud)

主文件

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

def function()
    do stuff with numpy and pandas
Run Code Online (Sandbox Code Playgroud)

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

Lui*_*raz 5

目前只有两种选择:

  1. 使用 requirements.txt
  2. 将依赖项与您的函数一起打包,请在此处链接

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

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

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

我添加了该rm -rf libs/*.dist-info部分是为了不让大量对该功能无用的库版本和分发信息污染源文件夹。这些pip在冻结和计划更新时使用。

编辑 6/14/2019

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

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

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

解释:

__file__是存在于每个模块中的全局变量,其中包含定义模块的文件的路径,即正在使用它的文件。在我们的例子中,路径为main.py.

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

从文件的路径,我们得到你的源代码目录的路径,os.path.dirname然后libsos.path.join.

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

之后,您无需预先添加libs.导入,只需使用正常的import numpy.

在完全独立的包上这可能有效,但不适用于具有依赖项的包,因为它们希望它们的依赖项可以直接导入(从 上的任何位置sys.path)。