【发布时间】: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