正如设计规范所明确的那样,Google Cloud Functions 的源目录预计将包括
main.py
、requirements.txt
和 __init__.py
。可以指定其他本地依赖项(即代码),只要它们的导入位于源目录内,如here所述。这会阻止导入同级或父目录。
在此目录设置中,
main.py
可以import internal.code_internal
,如果base/
已添加到PythonPath,则可以import base.code_sibling
。 Cloud Functions 的限制(根据设计)不允许后者导入,因为只有 functions/f/
的内容才会部署到其服务器。我的问题涉及符号链接的解决方法和使用。
base/
__init__.py
code_sibling.py
functions/
f/
__init
main.py
requirements.txt
internal/
__init__.py
code_internal.py
在传统Python中,可以向
functions/f/
添加一个指向base/
的符号链接,这样就可以导入base/
的内容,就好像它们直接位于functions/f/
目录中一样:在其他目录中话,就好像文件 functions/f/base/code_sibling.py
存在一样。然而,这种改进并没有改变云函数的部署行为:符号链接(似乎被gcloud functions deploy
忽略了。相反,我发现自己直接将base/
目录复制到functions/f/
中,然后部署云函数,然后删除functions/f/base/
复制的文件。
是否有人能够支持符号链接,或者是否有其他解决方法可以更好地解决这种情况? 谢谢你。
与此
票交叉发布到
functions-framework-python
。
Cloud Functions 使用与本地文件系统不同的文件系统。由于其只读文件系统,它们不支持符号链接或某些文件操作。您可以通过将所需的文件直接复制到 Cloud Function 源目录中来解决此问题。这是您的一个选择。
或者,您可以使用带有 --runtime\_file
标志的
gcloud 函数部署命令。该标志允许您指定包含配置详细信息的文件。在此文件中,您可以设置 PythonPath 以包含要从中导入的目录。
例如:
gcloud functions deploy my-function --runtime python37 --runtime_file runtime.yaml
在
runtime.yaml
文件中,您将拥有:
pythonPath:
- functions/f/base
这告诉 Cloud Functions 在
functions/f/base
目录中搜索导入。选择哪种解决方案取决于您需要导入的文件数量以及它们更改的频率。
更多参考: