python-3.x - 从 Cloud Functions 中的父目录或同级目录导入模块?
问题描述
我有一个托管在 Google Cloud Repository 中的存储库结构,对于 Google Cloud Functions,它看起来像这样:
.
module.py
/common
module1.py
module2.py
/cloudfunction1
main.py
requirements.txt
/cloudfunction2
main.py
requirements.txt
每个 cloudfunction 目录都部署为单独的云函数。
我想做的是从公共目录或根目录导入模块,但是使用一种sys.path.append('..')
方法似乎不起作用。我想这是因为云功能部署过程只包含main.py所在目录下的文件吧?
我该如何解决这个问题?
解决方案
如果您发现自己需要修改sys.path
或以其他方式导入“超出顶级包”,这通常是 Python 中的代码异味,表明您的项目结构不正确。
在这个 Cloud Functions 示例中,您可以做的一件事是像这样构建您的项目:
.
├── common
│ ├── module1.py
│ └── module2.py
├── main.py
└── requirements.txt
其中main.py
包含两个功能:
from common import module1, module2
def cloudfunction1(request):
...
def cloudfunction2(request):
...
您可以直接按名称部署这些功能:
$ gcloud functions deploy cloudfunction1 --runtime python37 --trigger-http
$ gcloud functions deploy cloudfunction2 --runtime python37 --trigger-http
或通过入口点:
$ gcloud functions deploy foo --runtime python37 --entry-point cloudfunction1 --trigger-http
$ gcloud functions deploy bar --runtime python37 --entry-point cloudfunction2 --trigger-http
请注意,这有一些缺点:
- 您的
requirements.txt
文件需要包含这两个函数的所有依赖项 - 如果您对目录进行更改,则
common
需要重新部署这两个函数
也就是说,如果您的函数如此相关以至于它们共享公共代码并且经常需要一起部署,那么更好的选择可能是让它们成为单个 App Engine 应用程序的一部分。(这仅适用于它们都使用 HTTP 触发器的情况)。
推荐阅读
- firebase - 仅当集合 1 中的数据与集合 2 中的数据匹配时才填充
- git - 在没有结帐的情况下拉出远程分支(从另一个分支)
- vimeo-api - 如何从developers.vimeo.com 中删除应用程序?
- javascript - 从包含特定值的对象的多维数组中返回数组对象
- mysql - 如何使用 laravel fluent 查询生成器获取行数
- typescript - document.readyState 的正确类型是什么?解决错误 readyState 不是 EventTarget 类型
- google-apps-script - 如何将我的密钥添加到这个谷歌应用脚本?
- libgit2sharp - 'LibGit2Sharp.Core.NativeMethods' 的类型初始化程序引发了异常。“无法加载 DLL 'git2-572e4d8':
- javascript - 如何在javascript中实现可用作桌面滚动的触摸事件?
- xml - LibXML:“xmlns”属性被报告但不在 XML 输入文件中