ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在Google Cloud功能中访问用户定义的包(ModuleNotFoundError:没有名为…的模块)

2019-07-10 14:06:01  阅读:243  来源: 互联网

标签:python git package google-cloud-platform google-cloud-functions


我正在从源存储库部署Google Cloud功能.只要我没有在我的main.py中对存储库中的任何用户定义函数进行任何引用(即包中的脚本/函数或除了main之外的package2中的脚本/函数),我就可以使Google功能部署得很好. PY).

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

我有关于此功能部署herehere的最近有2个Stack Overflow问题.他们共同指导我找到一个解决方案,其中main.py和requirements.txt在一个包中,我使用该包作为源部署Google Cloud Function.现在的问题是我需要能够访问其他包/脚本中的函数/脚本.如果我在main.py中包含一个类似于package.script1 import foo的语句,我在部署函数时会收到类似下面的错误:

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

由于this stack overflow question中的问题,将main.py和requirements.txt移回根目录不起作用.

我需要一种在gcloud函数deploy …语句中导入用户定义的包/函数的方法.我的main.py使用package.script1.py,package.script2.py,package2.script3.py和package2.script4.py中的函数.如何实现这一目标?

编辑/更新信息

我在每个包(package和package2)中都有__init__.py文件,但它们目前是空白/空的.

我尝试了以下gcloud deploy …选项:

使用此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

>在这个问题中使用原始文件结构(包中有main.py和requirements.txt),我已经尝试了上面提供的deploy语句.它解决了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

标签:python,git,package,google-cloud-platform,google-cloud-functions
来源: https://codeday.me/bug/20190710/1424923.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有