【问题标题】:Call shell script from within Google Cloud function从 Google Cloud 函数中调用 shell 脚本
【发布时间】:2022-01-21 14:28:40
【问题描述】:

我正在尝试使用 Python 在 Google Cloud Function 中调用一个简单的 shell 脚本。 但是,由于某种原因,即使我发现它在环境的同一目录中,也找不到该脚本。

我的 main.py 的脚本如下所示:

import subprocess
import os

def reload_plm(request):
    request_json = request.get_json()
    if request.args and 'message' in request.args:
        return request.args.get('message')
    elif request_json and 'message' in request_json:
        return request_json['message']
    else:
        files = [f for f in os.listdir(os.getcwd()) if os.path.isfile(f)]
        print(os.getcwd()) # output: /workspace
        print(files) # output: ['gettoken.sh', 'k.key', 'main.py', 'requirements.txt']
        load_token()
        return f'Hello World!'


def load_token():
    output = subprocess.call(["/workspace/gettoken.sh","k.key","argument1", "argument2"])
    print(output)

如您所见,在相对路径不起作用后,我什至尝试使用脚本的绝对路径,但结果相同:

FileNotFoundError: [Errno 2] No such file or directory: '/workspace/gettoken.sh'

FileNotFoundError: [Errno 2] No such file or directory: './gettoken.sh'

我在本地测试了脚本,它确实有效。我在这里做错了什么?

编辑: 正如 Kolban 所指出的,不应假设存在某个操作系统环境。但是,如果您发现自己在 Linux 上,这可行:

解决方案:我找到了原因。这是因为我在脚本中使用了 #!/bin/sh 而不是 bash。显然,这个 shebang 导致只评估 PATH 而不是当前目录。我通过将命令修改为. ./gettoken.sh

解决了这个问题

【问题讨论】:

  • 在执行之前可以试试chomd +x /workspace/gettoken.sh吗?
  • 我的想法是,也许我们希望避免从 Cloud Functions 环境中调用 shell 脚本。 Cloud Functions 的概念是为您提供一个可以执行您的编程语言功能的环境。从内部执行 shell 脚本会做出包括“在 Linux/Unix 中运行”、“派生额外进程的能力”、“运行脚本的权限”、“甚至可以运行 shell 二进制文件”等假设。我建议如果您想拥有该环境,请查看 Cloud Run。
  • @Kolban 如果我没记错的话,我想说这实际上是答案。环境中缺少权限,因为它是一个 shell 脚本。我可以建议发布您的评论作为答案吗?
  • 感谢@Kolban 我之前知道 Cloud Run 的可能性,但只是希望有一种方法可以使用 Cloud Functions 而无需使用容器。我今天将使用 Cloud Run 进行尝试。随意写下您的评论作为答案。

标签: python google-cloud-functions subprocess


【解决方案1】:

我们的想法是,也许我们希望避免从 Cloud Functions 环境中调用 shell 脚本。 Cloud Functions 的概念是为您提供一个可以执行您的编程语言功能的环境。从内部执行 shell 脚本会做出包括“在 Linux/Unix 中运行”、“派生额外进程的能力”、“运行脚本的权限”、“甚至可以运行 shell 二进制文件”等假设。我建议,如果您想拥有该环境,请查看 Cloud Run。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2018-09-11
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2020-08-17
    • 2014-04-30
    • 2012-03-08
    • 2016-03-13
    相关资源
    最近更新 更多