python - 使用 Cloud Source 存储库设置 Google Cloud Function 时出现 ModuleNotFoundError
问题描述
我正在基于 BitBucket 存储库中的代码部署 Google Cloud Function。我已经将 BitBucket 帐户链接到 Google Cloud “Source Repositories”,并且 Google Function 可以找到 repo 等。问题是我的 main.py 函数需要调用我的存储库中其他包/模块中的几个函数。我的 main.py 文件顶部有一些简单的导入语句,如下所示:
import base64
import json
from datetime import datetime
from competitor_scrape.headless import headless_browser
...
前几行加载正常,但是当我尝试使用存储库中的 main.py 定义 Google Cloud Functions 时,第 4 行(在我的 BitBucket 存储库中调用模块/函数的行)会导致 Google Functions 出现此错误:
message: "Function load error: Code in file main.py can't be loaded.
Did you list all required modules in requirements.txt?
Detailed stack trace: Traceback (most recent call last):
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 211, in check_or_load_user_function
_function_handler.load_user_function()
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 140, in load_user_function
spec.loader.exec_module(main)
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/user_code/main.py", line 4, in <module>
from competitor_scrape.headless import headless_browser
ModuleNotFoundError: No module named 'competitor_scrape.headless'
它询问我是否“列出[ed] requirements.txt 中所有必需的模块”。我可以列出我自己的存储库中的模块吗?如果是这样,我应该怎么做?我找不到任何有关如何执行此操作的文档。
我当前的 requirements.txt 文件如下所示:
google-cloud-pubsub
numpy==1.14.5
pandas==0.22.0
psycopg2==2.7.4
selenium==3.4.3
geopy==1.11.0
googlemaps==2.5.1
ratelimiter==1.2.0
sqlalchemy==1.2.0
zeep==2.5.0
编辑/更新
我的存储库文件结构现在看起来像这样:
.
├── competitor_scrape
│ ├── __init__.py
│ └── headless.py
├── main.py
└── requirements.txt
headless_browser
是在 中定义的函数headless.py
。然而,此时我的__init__.py
内部competitor_scrape
是空的(它是由 PyCharm 自动生成的)。看来这__init__.py
可能是问题的根源。我应该如何填充该脚本,以便competitor_scrape
Google Cloud Function 可以使用其中的脚本/函数?
解决方案
您不应该在其中包含模块requirements.txt
——这只是为了从 PyPI 安装依赖项。
导入语句,如:
from competitor_scrape.headless import headless_browser
意味着你应该有一个类似这样的目录结构:
.
├── competitor_scrape
│ ├── __init__.py
│ └── headless
│ └── __init__.py
├── main.py
└── requirements.txt
在competitor_scrape/headless/__init__.py
文件中,您应该有一个名为headless_browser
.
推荐阅读
- reactjs - React formik 表单渲染速度很慢的问题
- php - 在php中计算字符串中的动态文本
- html - 如何将此 flexbox 联系表单转换为 CSS 网格?
- shell - uDeploy,在switch中引用shell变量
- pytorch - Pytorch 数据集中无法打开共享文件映射错误
- html - 带引导程序的离线 PWA 视图
- keycloak - Keycloak 自定义用户存储提供程序(分配的角色集/有效角色为空)
- github - egit.core:如何以编程方式修改文件
- html - 如何在不更改当前 URL 的情况下发出 html 请求?
- arrays - 使用顶级数据在 Swift 中解码对结构数组的 JSON 响应