Google Cloud Function - 函数加载错误:预期定义函数的文件 main.py 不存在

Posted

技术标签:

【中文标题】Google Cloud Function - 函数加载错误:预期定义函数的文件 main.py 不存在【英文标题】:Google Cloud Function - Function load error: File main.py that is expected to define function doesn't exist 【发布时间】:2019-02-25 04:34:20 【问题描述】:

我正在尝试实现一个基于 Git 样式存储库中代码的 Google Cloud 功能。我将代码链接到 Google Cloud Platform 的“源代码库”,当我将代码复制并粘贴到 GCP 函数“内联编辑器”中时,我的函数运行良好。当我切换到“云源存储库”选项时,我可以看出它正在从该存储库读取;在此之前,我解决了其他错误。但是,在解决了先前/其他问题之后,现在我收到了这个错误:

Function load error: File main.py that is expected to define function doesn't exist

我的文件的结构与此类似,根目录下有main.py

.
├── package
|   ├──script1.py
|   └──script2.py
├── package2
├── ...
├── main.py
└── requirements.txt

requirements.txt 读取正常(之前的一些错误来自该读取过程),但为什么它不能从main.py 读取?我在 GCP 函数中的设置如下所示:

我试图将 main.py 移动到项目中的另一个目录并将“包含源代码的目录”设置为该目录,但这给了我一个错误,说它找不到该目录。有什么建设性的想法吗?

编辑/附加信息

我正在使用我的存储库中的一个分支,而不是 master,并且我正在为此功能使用 Google Cloud Pubsub 主题触发器。

【问题讨论】:

一切看起来都正确。更改后如何部署此功能? 我推送到 Bitbucket,它与 Google 的“源存储库”同步。我已经验证同步发生得非常快(~1-2 秒)。我刚刚刷新了谷歌“源代码库”页面以确保......仍然无法正常工作。 【参考方案1】:

您是否在推送新提交后重新部署该功能?您需要执行以下操作:

gcloud functions deploy NAME \
  --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/master/paths/SOURCE \
  TRIGGER

更多详情请见https://cloud.google.com/functions/docs/deploying/repo。

【讨论】:

出于某种原因,将main.py 移动到PACKAGE 文件夹,然后使用以下命令有效,而其他选项无效:gcloud functions deploy NAME --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/BRANCH_NAME/paths/PACKAGE/ --trigger-topic TOPIC 知道为什么我无法使用基于 Web 的 GCP 功能 GUI 成功设置此功能吗?【参考方案2】:

如果您尝试使用 GCS 存储桶或文件上传功能上传您的代码 zip,请确保您不要压缩包含您的代码的文件夹,而只是压缩代码文件。

CodeFolder
├── package
|   ├──script1.py
|   └──script2.py
├── package2
├── ...
├── main.py
└── requirements.txt

不要CodeFolder创建一个Zip文件。

改为从main.pyrequirement.txtpackage 创建一个 zip 文件。

Source

【讨论】:

"相反,从 main.py 和 requirements.txt 和包创建一个 zip 文件。" - 荣誉!【参考方案3】:

我遇到了类似(可能相同?)的问题。我发生的事情是我所有的文件都是这样的格式:

    [zip 文件名]/main.py [zip 文件名/[等]

并且错误一直说它找不到main。我猜这是因为它有一个父文件夹。在查看了 zipping 到 parent 之后,我确定这不是问题。

我下载了 zip 并查看了自动生成的 dialogflow 云函数代码,发现它们有一个“package.json”文件。相反,我只有一个“requirements.txt”文件。我将 package.json 文件复制到我的源代码中,将其编辑为正确的内容,将其压缩,然后正确编译云函数。

package.json 看起来像:


  "name": "test",
  "description": "testingThings",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "ABCDEFG",
  "engines": 
    "node": "8"
  ,
  "scripts": 
    "start": "firebase serve --only functions:test",
    "deploy": "firebase deploy --only functions:test"
  ,
  "dependencies": 
    "google-cloud-storage": "",
    "google-cloud-firestore": "",
  

我相信他们使用它来部署谷歌云功能,所以没有它他们会崩溃。

【讨论】:

【参考方案4】:

如果尽管有其他答案,您仍然无法使其工作,我终于通过执行以下操作摆脱了这个错误:

确保文件的路径正确(尤其是 json 文件,如果您要从中加载凭据,请注意相对路径) 检查您的 requirements.txt 文件:我使用 pipreqs 自动生成它,但它出现了一些错误(例如,对于 google-cloud-tasks 等模块,使用“_”而不是“-”) .我建议根据您的导入自己编写 requirements.txt。

我希望这会有所帮助。

【讨论】:

【参考方案5】:

您的云功能在到达您指定的入口点功能之前是否正在执行任何操作?如果发生任何未处理的异常,GCF 将不会到达入口点函数并抛出此错误。例如:

class SomeClass:
    def __init__(self):
        raise ValueError

err = SomeClass()

def main(event, context):
    pass

会引发同样的错误:Function load error: File main.py that is expected to define function doesn't exist。那是因为你的入口点函数永远不会到达。查看在定义函数之前运行的代码,您可能会发现有问题。

【讨论】:

以上是关于Google Cloud Function - 函数加载错误:预期定义函数的文件 main.py 不存在的主要内容,如果未能解决你的问题,请参考以下文章

从 Cloud Function (python) 写入 Google Cloud Storage

Cloud Function 部署问题以安排每日 Cloud SQL 导出到 Google Cloud Storage

在 Google Cloud Function 中设置环境变量

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期

Google Cloud Pub/Sub - Cloud Function & Bigquery - 数据插入未发生

Python Google Cloud Function 记录严重性和重复项