Python 中数字海洋函数的可重用实用方法

问题描述 投票:0回答:1

我希望能够跨多个 Digital Ocean Functions(他们的无服务器工具)重复使用代码。如果可以避免的话,我不想发布一个库。

我尝试了几种方法,但我愿意做任何事情来让它发挥作用。

方法1.单个文件

我的第一次尝试是使用具有多个函数入口点的单个文件。

packages/tom/
下我有文件
tomsfns.py

def t1():
    return { "body", make_msg("T1") }

def t2():
    return { "body", make_msg("T2") }

def make_msg(caller):
    return "Hello " + caller

像吐司一样愚蠢,但应该可以正常工作。在 project.yml 中的包下,我有以下内容:

- name: tom
    functions:
      - name: tomsfns
        main: t1
        binary: false
        runtime: python:3.11
        web: false

      - name: tomsfns
        main: t2
        binary: false
        runtime: python:3.11
        web: false

部署时实际发生的情况是,您将获得一个函数、

tom/tomsfns
以及该单个文件中的全部代码。我希望的是同一代码库中的两个函数,即使它们重复了代码。

多文件

我的第二次尝试是将所需的实用程序分解为它自己的 python 文件,然后让单独的文件调用它。这是对我来说最有意义但也不起作用的“风格”。

其结构和全部内容都是:

    packages
        rick
            r1.py
                 import make_msg
                 def main():
                    return { "body": make_msg("R1") }
            r2.py
                 import make_msg
                 def main():
                    return { "body": make_msg("R2") }
            rickutils.py
                 def make_msg(caller):
                    return "Hello " + caller

(开始:在原帖后添加)

相关的project.yml为:

    - name: rick
      functions:
       - name: r1
         runtime: python:3.11
         web: false

       - name: r2
         runtime: python:3.11
         web: false

(完:在原帖后添加)

这会在已发布的函数中产生看似正确的结构和代码:

    Deployed functions ('doctl sls fn get <funcName> --url' for URL):
     - rick/r1
     - rick/r2
     - rick/rickutils
     - tom/tomsfns

但是

  • 我不希望 rickutils 作为一个函数
  • 更重要的是,这些功能无法运行。

stderr: Invalid function: No module named 'make_msg'

我已经尝试了我能想到的导入语句和文件位置的所有组合,以将该方法放入函数代码中,但没有任何效果。

有人对这种事情有任何想法或例子吗?

谢谢。

python function digital-ocean
1个回答
0
投票

文档页面 https://docs.digitalocean.com/products/functions/reference/build-process/ 讨论了可能的

lib/
目录和可能的
build.sh
构建脚本。

我(ab?)使用构建脚本将库代码包含在函数目录中。我真的不确定这是否是正确的方法,但否则我无法在运行时环境中的任何地方找到库代码。

它的外观如下:

$ find lib/ packages/
lib/
lib/ricklib.py
packages/
packages/rick
packages/rick/r1
packages/rick/r1/ricklib.py
packages/rick/r1/build.sh
packages/rick/r1/__deployer__.zip
packages/rick/r1/__main__.py
packages/rick/r2
packages/rick/r2/__main__.py

$ cat packages/rick/r1/build.sh
cp ../../../lib/ricklib.py .

$ unzip -l packages/rick/r1/__deployer__.zip 
Archive:  packages/rick/r1/__deployer__.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     1295  04-12-2024 22:10   __main__.py
       19  04-12-2024 22:10   ricklib.py
---------                     -------
     1314                     2 files

请注意,函数目录中的

__deployer__.zip
ricklib.py
是因为构建过程而存在的。它们不应该存在于干净的存储库中。

© www.soinside.com 2019 - 2024. All rights reserved.