python - 在谷歌云函数中访问用户定义的包(ModuleNotFoundError : No module named. ..)

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

我正在从源存储库部署 Google Cloud 函数。只要我不在我的 main.py 中对存储库中我的任何用户定义函数(即 packagepackage2main.py 除外)。

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

我最近有 2 个关于此函数部署的 Stack Overflow 问题 herehere .他们共同指导我找到了一个解决方案,其中 main.pyrequirements.txt 位于一个包中,我使用该包作为源来部署 Google Cloud Function。现在的问题是我需要能够访问其他包/脚本中的函数/脚本。如果我在 main.py 中包含类似 from 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.pyrequirements.txt 移回根目录.

我需要一种在 gcloud functions deploy ... 语句期间导入用户定义的包/函数的方法。我的 main.py 使用了 package.script1.pypackage.script2.pypackage2.script3.py 中的函数package2.script4.py。如何实现?

编辑/更新信息

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

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

  1. main.pyrequirements.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. 本题使用原始文件结构(package中有main.pyrequirements.txt),我已尝试上面提供的部署语句。它解决了 main.py not found 问题,但给我上面原始问题中所述的错误

我还应该尝试什么?

最佳答案

您应该像这样构建您的应用:

.
├── 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 - 在谷歌云函数中访问用户定义的包(ModuleNotFoundError : No module named. ..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523514/

相关文章:

windows - 有没有办法在 Windows PowerShell 中获得 Git 体验?

networking - 无法从 Compute Engine 虚拟机实例 (GCP) 连接到 Memorystore

authentication - 提供授权 header 以使用 google ml-engine 的方法

google-app-engine - 当实例自动重启时如何防止 App Engine Flex 停机

git - 通过 SSH git push 设置环境变量

linux - Git checkout 未跟踪问题

python - Pandas 保留索引排序

python - Access-Control-Allow-Origin 不允许对 Pyramid 返回 Origin 的 ajax 请求

python - 计算 30 个工作日有多少周?

python:返回 bool 值和字符串在一起的错误