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.py
、requirement.txt
和package
创建一个 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 订阅确认截止日期