部署具有所有程序包依赖项的Python Cloud Function

时间:2019-06-11 14:32:36

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

我想部署不依赖于使用requirements.txt来安装软件包的云功能。我希望软件包可以在存储中使用,也可以将其压缩并上传作为功能的一部分。这可能吗?

编辑6/14/2019

基本上,我想使用我的代码发送numpy和pandas之类的包以部署云功能。如果pypi.org不可用,我想这样做。我已经尝试过这段documentation。下面是我尝试做的一个例子:

文件夹结构:

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

main.py

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

def function()
    do stuff with numpy and pandas

然后,我尝试从gcloud命令行和gcp UI部署功能,但均失败。如果可以的话,请帮忙。

1 个答案:

答案 0 :(得分:2)

目前只有两种选择:

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

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

如果选择使用第二个选项,则参数-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在冻结和计划更新时使用它们。

编辑6/14/2019

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

使用libs文件夹可以使一切井井有条,因此,如果要保留软件包,则需要供应该文件夹,然后将此文件夹添加到main.py的顶部,然后再执行其他所有导入操作:< / p>

# 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语句将首先在该文件夹上查找,并且该包不在该文件夹中,然后继续其余的查找目录。
如果您只想在libs包在系统和python环境中不可用的情况下寻找它们,请附加libs路径,而不是将其插入索引1。

此后,您无需在导入文件前加上libs.,只需使用普通的import numpy

在完全独立的程序包上,这可能会起作用,但在具有依赖项的程序包上却行不通,因为他们希望它们的依赖项可以直接导入(从sys.path上的任何地方)。