我想部署一个不依赖于使用 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 部署该功能,但都失败了。如果这是可能的,请帮忙。

最佳答案

目前只有两种选择:

  • 使用 requirements.txt
  • 将依赖项与您的函数 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 在卡住和计划更新时使用这些。

    编辑 6/14/2019

    您将库保存在 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 完整路径作为系统路径 上的第一个查找位置。新的导入语句将首先查看该文件夹,并且该包不在那里,其余的查找目录将正常进行。
    如果您希望仅在系统和 python 环境中不可用时才在 libs 上查找包,请附加 libs 路径而不是将其插入索引 1。

    之后,您无需在导入前添加 libs. ,只需使用普通的 import numpy 即可。

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

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

    10-13 09:28