Доступ к пользовательским пакетам в облачной функции Google (ModuleNotFoundError: модуль не указан ...) - PullRequest
0 голосов
/ 26 сентября 2018

Я развертываю функцию Google Cloud из исходного хранилища.Я могу получить функцию Google для точного развертывания, если в своем main.py я не буду ссылаться ни на одну из моих пользовательских функций в хранилище (т. Е. Скрипты / функции в package или package2 ниже.кроме main.py).

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

У меня есть 2 недавних вопроса о переполнении стека относительно этой функции: здесь и здесь .Они вместе направили меня к решению, в котором main.py и requirements.txt находятся в пакете, и я развернул Облачную функцию Google с этим пакетом в качестве источника.Однако теперь проблема в том, что мне нужно иметь доступ к функциям / сценариям в других пакетах / сценариях.Если я включаю оператор типа from package.script1 import foo в main.py, при развертывании функции появляется ошибка, подобная приведенной ниже:

ERROR: (gcloud.functions.deploy) OperationError: code=3, 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/wo
rker.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/wo
rker.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 package.script1 import foo
ModuleNotFoundError: No module named 'package'

В настоящее время я развертываю эту функцию с помощью этого оператора развертывания функции Google:

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

Перемещение main.py и requirements.txt обратно в корневой каталог не работает из-за проблем в этот вопрос переполнения стека .

Мне нуженспособ импорта пользовательских пакетов / функций во время оператора gcloud functions deploy ....My main.py использует функции в package.script1.py, package.script2.py, package2.script3.py и package2.script4.py.Как это можно сделать?

РЕДАКТИРОВАНИЕ / ОБНОВЛЕНИЕ ИНФОРМАЦИИ

У меня есть __init__.py файлов в каждом из пакетов (package и package2), но в настоящее время они пустые/empty.

Я попробовал следующие опции gcloud deploy...:

  1. main.py и requirements.txt в корневом каталоге (вместо конфигурации, как показано выше)/ первоначально) с помощью этой команды развертывания:

    gcloud functions deploy NAME --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/BRANCH --trigger-topic TOPIC
    

    Это приводит к следующей ошибке:

    ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: File main.py that is expected to define function doesn't exist
    
  2. При попытке явно вызвать корневой каталог как источникЯ также пробовал это с той же конфигурацией файла, что и в # 1

    gcloud functions deploy NAME --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/BRANCH/paths/ --trigger-topic TOPIC
    

    Это дает мне ту же ошибку, что и # 1:

    ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: File main.py that is expected to define function doesn't exist
    
  3. Используя исходную файловую структуру в этом вопросе (с main.py и requirements.txt в package), я попробовал оператор развертывания, представленный выше.Это решает проблему main.py not found, но выдает ошибку, как указано в оригинальном вопросе выше

Что еще мне следует попробовать?

1 Ответ

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

Вы должны структурировать свое приложение так:

.
├── main.py
├── package
│   ├── __init__.py
│   ├── script1.py
│   └── script2.py
├── package2
│   ├── __init__.py
│   ├── script3.py
│   └── script4.py
└── requirements.txt

Тогда в main.py вы можете сделать:

from package.script1 import foo
from package2.script2 import bar
# etc
...