【问题标题】:Python Click, Apache OpenWhisk, IBM Cloud Functions, main system exit issuesPython Click、Apache OpenWhisk、IBM Cloud Functions、主要系统退出问题
【发布时间】:2018-12-07 17:38:08
【问题描述】:

我有一堆基本上是通过 Click CLI 框架入口点执行的 python 代码。

我正在探索如何将一些 CLI 函数制作成 WebActions,并且正在寻找 IBM Cloud Functions,它基本上是 Apache OpenWhisk。

我是 OpenWhisk 和 IBM CloudFunctions 的新手。

我在这里关注帮助文档:

https://console.bluemix.net/docs/openwhisk/openwhisk_actions.html#creating-python-actions

试图模仿 virtualenv 方法。

当我将他们的基本示例翻译为 Click CLI 命令时,如下所示:

(以下是文件__main__.py 的内容,该文件最初是一个名为hello_too.py 的文件,但随着IBM Docs 的变化如下)

import click

@click.command()
@click.argument('params', nargs=-1)
def main(params):
    #name = args.get("name", "stranger")
    greeting = "Hello " + "foo" + "!"
    print(greeting)
    return {"greeting": greeting}

if __name__ == "__main__":
    main()

然后将其压缩并上传(根据他们的 virtualenv 示例)作为 web 操作我收到以下错误

{
  "error": "The action did not produce a valid JSON response: Internal Server Error"
}

我在其他一些博客上看到,使用 -i 运行 python 是对 OpenWhisk 运行时的良好完整性检查。

当我使用 -i 运行此代码时,我会在系统退出时获得堆栈跟踪。

Traceback (most recent call last):
  File "hello_too.py", line 12, in <module>
    main()
  File "/Users/mcmasty/projects/ppf-github/experiments/ibm-api-connect/venv/lib/python2.7/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/Users/mcmasty/projects/ppf-github/experiments/ibm-api-connect/venv/lib/python2.7/site-packages/click/core.py", line 700, in main
    ctx.exit()
  File "/Users/mcmasty/projects/ppf-github/experiments/ibm-api-connect/venv/lib/python2.7/site-packages/click/core.py", line 484, in exit
    sys.exit(code)
SystemExit: 0

但是当我运行示例代码时,非点击启用,交互式解释器确实抱怨。

关于将 Click CLI 脚本移植为 OpenWhisk Actions / IBM Cloud Functions 的最简单路径的任何建议?

  • 我尝试点击 standalone_mode 来更改 SystemExit 的行为,但似乎无法正常工作
  • 我还尝试了将命令命名为 echo 并在 OpenWhisk 操作创建上使用 --main echo 选项。 (结果相同)
  • 我还尝试了多种返回 JSON 字符串的变体(通过 json.dumps()),无论是通过返回还是通过写入标准输出,都采用 zip 打包和 Docker 映像打包...(结果相同)

由于 python 字典基本上是硬编码的结果,我现在最好的猜测是运行单击启用脚本时的堆栈跟踪是我部署到 IBM Cloud Functions 时问题的根源。

提前致谢。


响应 cmets 的附加信息

上面提供的代码。该代码位于名为 __main__.py 的文件中(根据 IBM Docs https://console.bluemix.net/docs/openwhisk/openwhisk_actions.html#creating-python-actions

然后按照 IBM Docs 的...

docker run --rm -v "$PWD:/tmp" openwhisk/python2action    bash  -c "cd tmp && virtualenv virtualenv && source virtualenv/bin/activate && pip install -r requirements.txt"  

requirements.txt 中唯一的要求是click

然后也遵循 IBM Docs

zip -r hello_too.zip virtualenv __main__.py  

和健全性检查

python -i hello_too.zip  

引发类似于上面示例的 SystemExit 异常/堆栈跟踪。

但是

python hello_too.zip    

正常完成。

然后部署到 Cloud Functions / Web Actions

ibmcloud wsk action create hello_too --kind python:2 hello_too.zip --web true 

然后通过命令行调用

ibmcloud wsk action invoke --result hello_too  

我收到以下消息:

{
"error": "The action did not produce a valid JSON response: Internal Server Error"
}  

但是硬编码的响应

return {"greeting": greeting}  

与“创建和调用 Python 操作”部分https://console.bluemix.net/docs/openwhisk/openwhisk_actions.html#creating-python-actions中的示例代码相同

所以我假设这不是问题的根本原因。 (我运行了他们的示例代码,如文档中所述并返回 Python dict 工作正常。)

只是当我尝试使用点击版本的python时,我卡住了。

【问题讨论】:

  • 提供您如何创建操作以及如何调用它的代码。
  • @data_henrik 我在原始帖子中添加了其他信息
  • 我确实复制了这个错误并在下面添加了评论。您不能使用click 模块,该模块用于在非 CLI 环境中构建 CLI 工具。

标签: python python-2.7 ibm-cloud openwhisk


【解决方案1】:

click 模块导致运行时错误,导致运行代码的底层 Python 进程终止。

click 模块旨在构建命令行界面工具。 OpenWhisk 操作的 Python 代码由现有 Python 脚本动态评估和调用。您将需要重构您的应用程序以通过原始函数而不是 click 模块公开核心函数。

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 2019-04-27
    • 2016-07-05
    • 2018-08-05
    • 2020-09-29
    • 1970-01-01
    • 2019-06-06
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多