【问题标题】:Deploy GCP Cloud function with local dependencies使用本地依赖项部署 GCP Cloud 功能
【发布时间】:2020-05-31 22:27:46
【问题描述】:

我一直在尝试部署具有一些私有依赖项 (pyodbc) 的云函数,因为我无法通过 requirements.txt 让它工作。请注意,我不想在这里使用 Docker。所以我在这里建立的只是文件,

1. main.py
2. process.py ( this one use pyodbc to connect to teradata)
3. libs (folder)
   3.1 pyodbc-4.0.30.dist-info (package)
   3.2 pyodbc (python extension module)
   3.3 __init.py__ ( this is to make this folder as module)
4.requirements.txt

我还更新了 process.py 文件以导入 pyodbc 模块,如下所示,

import libs.pyodbc

请注意:我使用 GCP 文档安装 pyodbc 包并使用 https://cloud.google.com/functions/docs/writing/specifying-dependencies-python 放入库中 最重要的是,我也是requirements.txt默认导入。

但我仍然收到如下模块错误。

Error message: 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/worker.py", line 305, in check_or_load_user_function
    _function_handler.load_user_function()
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 184, 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 9, in <module>
    from process import process
  File "/user_code/process.py", line 6, in <module>
    import libs.pyodbc
ModuleNotFoundError: No module named 'libs.pyodbc'

非常感谢这里的任何线索或帮助。我在这里想要实现的是,从 GCP 存储桶读取 CSV 文件并通过加载到 teradata 的数据帧对其进行处理,并将输出文件生成回另一个 GCP 存储桶。我正在尝试仅使用 Cloud Functions 来实现所有功能。谢谢

【问题讨论】:

  • this 问题有帮助吗?它可以避免必须在本地打包,我怀疑你会遇到同样的问题(需要 ODBC 头文件)。
  • 没有。我已经检查过了,它与运行应用程序引擎有关。好吧,我试图通过仅使用云功能来简化它。我在这里只需要在云功能环境中执行 pyodbc 而不像 docker 那样增加更多复杂性。
  • "除此之外,我也是requirements.txt 默认导入。"这是什么意思?
  • 我的意思是,我在这里也使用 requirements.txt 来指定我没有在这里打包的其他依赖项。 pyodbc 是我想从打包代码中导入的唯一依赖项。
  • 我会避免使用 pyodbc,因为它需要 odbc 二进制文件 - 如果要与 teradata 交互,只需使用本机 pypi.org/project/teradatasql

标签: python google-cloud-platform google-cloud-functions teradata pyodbc


【解决方案1】:

pyodbc 项目在这里可能有点特殊,因为:

  1. 该项目需要一些特定于平台的代码;
  2. 他们尚未发布最新版本的源代码分发版(仅内置分发版)。

这是我为使其正常工作所做的工作。从一个空的libs 目录开始,首先下载最新的可用源码分发:

$ pip download pyodbc --no-binary :all:

为模块创建一个目录:

$ mkdir libs/pyodbc

将源代码解压到模块中:

$ tar xf pyodbc-4.0.28.tar.gz -C libs/pyodbc

那么,在函数中你可以这样做:

import libs.pyodbc

【讨论】:

  • 这个目录不应该需要一个空的_init.py _文件来把这个目录变成一个模块吗?
猜你喜欢
  • 2021-03-29
  • 2019-02-13
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2021-10-05
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多