我想部署一个不依赖于使用 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
它们不能在存储时压缩,它们将被视为函数源的一部分。
如果您选择使用第二个选项,参数
-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/