从Cloud Functions中的父目录或兄弟目录导入模块?

时间:2018-11-03 16:26:18

标签: python-3.x google-cloud-functions google-cloud-repository

我在Google Cloud存储库中托管了一个存储库结构,对于Google Cloud Functions,它看起来像这样:

.
module.py
/common
     module1.py
     module2.py
/cloudfunction1
     main.py
     requirements.txt
/cloudfunction2
     main.py
     requirements.txt

每个cloudfunction目录都部署为单独的cloud功能。

我想做的是从公共目录或从根目录导入模块,但是使用sys.path.append('..')方法似乎不起作用。我认为这是因为云功能部署过程仅包括main.py所在目录中的文件?

我该如何解决?

1 个答案:

答案 0 :(得分:6)

如果您发现自己需要修改. ├── common │   ├── module1.py │   └── module2.py ├── main.py └── requirements.txt 或以其他方式“超出顶级包”导入,则通常是Python中的代码异味,表明您的项目结构不正确。

在此Cloud Functions示例中,您可以做的一件事是像这样构建项目:

main.py

from common import module1, module2 def cloudfunction1(request): ... def cloudfunction2(request): ... 包含两个功能:

$ gcloud beta functions deploy cloudfunction1 --runtime python37 --trigger-http
$ gcloud beta functions deploy cloudfunction2 --runtime python37 --trigger-http

然后直接按名称部署这些功能:

$ gcloud beta functions deploy foo --runtime python37 --entry-point cloudfunction1 --trigger-http
$ gcloud beta functions deploy bar --runtime python37 --entry-point cloudfunction2 --trigger-http

或按入口点:

requirements.txt

请注意,这有一些缺点:

  • 您的common文件需要包含两个函数的所有依赖关系
  • 如果您对"Plymouth Rd"目录进行了更改,则需要重新部署这两个功能

也就是说,如果您的功能是如此相关,以至于它们共享通用代码并且经常需要一起部署,那么更好的选择可能是使其成为单个App Engine应用程序的一部分。 (仅当它们都使用HTTP触发器时才适用。)