ModuleNotFoundError при настройке облачной функции Google с репозиторием Cloud Source - PullRequest
0 голосов
/ 19 сентября 2018

Я внедряю облачную функцию Google на основе кода в хранилище BitBucket.Я уже связал учетную запись BitBucket с Google Cloud «Source Repositories», и функция Google может найти репозиторий и т. Д. Проблема заключается в том, что моей функции main.py необходимо вызывать несколько функций в других пакетах / модулях в моем репозитории.У меня есть несколько простых операторов импорта в верхней части моего файла main.py, например:

import base64
import json
from datetime import datetime
from competitor_scrape.headless import headless_browser
...

Первые несколько строк загружаются нормально, но 4-я строка (та, которая вызывает модуль / функцию в моем BitBucketхранилище) вызывает эту ошибку в функциях Google, когда я пытаюсь определить мою облачную функцию Google с помощью main.py в моем хранилище:

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'

Она спрашивает, есть ли у меня список всех необходимых модулейв файле require.txt ".Могу ли я перечислить модули из своего собственного хранилища?Если так, как я должен делать это?Я не смог найти никакой документации о том, как это сделать.

Мой текущий файл needs.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?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

К сожалению, проблема была довольно простой.Файл headless.py находился в локальном рабочем каталоге, но не был добавлен в контроль версий Git, поэтому он не обновлялся в облаке и поэтому не мог быть найден GCP.

0 голосов
/ 19 сентября 2018

Вы не должны включать модули в 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.

...