python - 在 Google Cloud Function 中访问用户定义的包(ModuleNotFoundError: No module named...)
问题描述
我正在从源存储库部署 Google Cloud 功能。只要我不在main.py
存储库中对我的任何用户定义函数(即脚本/函数中的任何一个package
或package2
以下的脚本/函数main.py
)进行任何引用,我就可以很好地部署 Google 函数。
.
├── package
| ├── __init__.py
| ├── main.py
| ├── requirements.txt
| ├── script1.py
| └── script2.py
├── package2
| ├── __init__.py
| ├── script3.py
| └── script4.py
└── ...
我最近有 2 个关于此功能的 Stack Overflow 问题 deploy here和here。他们共同指导我找到了一个解决方案,其中main.py
包含requirements.txt
在一个包中,我以该包为源部署了 Google Cloud Function。现在的问题是我需要能够访问其他包/脚本中的函数/脚本。如果我在部署函数时包含类似from package.script1 import foo
in的语句,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'
我目前正在使用这个谷歌函数部署语句部署这个函数:
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 ...
语句期间导入用户定义的包/函数的方法。Mymain.py
使用package.script1.py
, package.script2.py
,package2.script3.py
和中的函数package2.script4.py
。如何实现?
编辑/更新信息
我__init__.py
在每个包(package
和package2
)中都有文件,但它们目前是空白/空的。
我尝试了以下gcloud deploy...
选项:
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
为了显式调用根目录作为源,我还尝试了与 #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
在这个问题中使用原始文件结构(with
main.py
andrequirements.txt
inpackage
),我已经尝试了上面提供的部署语句。它解决了main.py
未找到的问题,但给了我上面原始问题中所述的错误
我还应该尝试什么?
解决方案
您应该像这样构建您的应用程序:
.
├── 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