我在AWS lambda上使用subprocess(),使用这个层。https:/github.comlambcigit-lambda-layer。
这是代码。
import json
import os
import subprocess
def lambda_handler(event, context):
os.chdir('/tmp')
subprocess.Popen(["git", "clone", "https:/github.com/hongmingu/requirements"], shell=True)
subprocess.Popen(["touch word.txt"], shell=True)
word = str(subprocess.check_output(["ls"], shell=True))
return {
'statusCode': 200,
'body': json.dumps(word)
}
并返回。
Response:
{
"statusCode": 200,
"body": "\"b'word.txt\\\\n'\""
}
所以有一些问题 subprocess.Popen(["git", "clone", "https:/github.com/hongmingu/requirements"], shell=True)
我检查了一下,有git的 subprocess.check_output(["git --version"], shell=True)
并且效果很好。
如何解决这个问题?
有几个问题。
首先,你需要等待 git
进程退出。要做到这一点,必须使用 subprocess.Popen
呼叫 .wait()
在被退回的 Popen
对象。但是,我建议使用 subprocess.check_call()
而不是自动等待进程退出,并在进程返回非零退出状态时引发错误。
其次,没有必要指定 shell=True
因为你没有使用任何shell扩展或内置。事实上,当你在使用 shell=True
第一个项目是命令字符串,其余项目是 shell 本身的参数,而不是命令。
最后,你的 GitHub URL 中少了一个斜杠。
试试这个。
subprocess.check_call(["git", "clone", "https://github.com/hongmingu/requirements"])