我想部署一个不依赖于使用 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 部署该功能,但都失败了。如果可能,请提供帮助。
最佳答案
目前只有两个选择:
- 使用
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
在卡住和计划更新时使用它们。
编辑 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/