【问题标题】:Import module from parent or sibling directory in Cloud Functions?从 Cloud Functions 中的父目录或同级目录导入模块?
【发布时间】:2019-04-07 13:34:30
【问题描述】:

我有一个托管在 Google Cloud 存储库中的存储库结构,对于 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所在目录下的文件吧?

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    如果您发现自己需要修改 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 触发器的情况)。

    【讨论】:

    • 谢谢达斯汀,这是有用的思考的食物,感谢您抽出时间回复。
    • requirement.txt 必须包含两个函数的所有依赖项是否会降低任何云函数的性能?
    • 它可能会使您的部署稍微长一些(因为它必须安装额外的依赖项),但它不会影响您的函数运行速度。
    • 嗨@Mike,这能回答你的问题吗?它似乎帮助了其他一些人,你能把它标记为接受吗?
    猜你喜欢
    • 2022-07-22
    • 2015-07-23
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多