首页 > 解决方案 > 使用 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_scrapeGoogle Cloud Function 可以使用其中的脚本/函数?

标签: pythongitgoogle-cloud-platformgoogle-cloud-functionsrequirements.txt

解决方案


您不应该在其中包含模块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.


推荐阅读