【问题标题】:encountered "sh: php: command not found" error while running os.system module in lambda在 lambda 中运行 os.system 模块时遇到“sh: php: command not found”错误
【发布时间】:2021-01-07 21:46:59
【问题描述】:

我正在尝试使用 python 运行时在 aws lambda 中运行 php 脚本。我尝试使用 python os.system 模块调用 php 页面来执行脚本。代码如下

import os
def lambda_handler(event, context):
    os.system("php /home/admin/web/####/###.php")

在运行上述代码时,它显示错误:“sh: php: command not found”。我在 python 脚本或 shell 脚本方面都没有太多知识。因此,我们将不胜感激。

更新: 新代码

def lambda_handler(event, context):
    stream = os.popen("/usr/bin/php /home/admin/web/path/")
    output = stream.read()
    print(output) 

使用了新代码,但现在显示此错误: /bin/sh: /usr/bin/php74: 没有这样的文件或目录。

我不明白,因为系统安装了php,但它却告诉不存在这样的文件。

【问题讨论】:

  • 这可能意味着你的运行环境中没有安装 PHP
  • 它安装在我的ec2环境中
  • 未安装 php 时会出现该错误。您是否尝试过在不使用 python 脚本的情况下运行php 文件?
  • 我无法在 aws lambda 中运行 php 脚本,因为没有 php 运行时,我试图通过使用 python 子进程或 os.system 绕过它。关于 php 文件,是的,我已经在浏览器上运行它并运行它。
  • 这似乎与您的other question 非常相似(以至于它可能被认为是重复的)。我们已经在那里取得了一些进展,请考虑在那里跟进,而不是创建一个非常相似的问题。问题的核心似乎是您想要调用 AWS Lambda 中不存在的可执行文件。您无法使用 Python 解决这个问题 - 您需要使用 PHP 和 Python 提供自定义运行时,或者从 Docker 映像构建您的 Lambda。

标签: python php aws-lambda


【解决方案1】:

您可以在默认的 Python Lambda 运行时运行 PHP 脚本。没有安装 PHP。

所以你有三个选择:

  1. 将您的 PHP 代码迁移到 Python。
  2. 使用 Python 和 PHP 创建 Docker 映像并将其用作 Lambda 运行时。这个功能是最近添加的,你可以在blog post阅读它。
  3. 创建自定义 Lambda 运行时,如documentation 中所述。

您的original question 包含您要运行的 PHP 脚本。它只包含一个非常简单的 MySQL 查询。将那一行 PHP 代码迁移到 Python 应该很容易。

PHP 代码:

<?php
$con1 = mysqli_connect("endpoint","###","###","database");
if(mysqli_query($con1,"insert into ex_inbox(time) values ('Done')") or die("the eror ".mysqli_error($con1)));
?>

因此,选项#1 是我推荐的选项。您可以阅读如何使用 Python in this guide 插入 MySQL 数据库。

【讨论】:

  • 在代码中使用die(mysqli_error($$conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?
【解决方案2】:

请指定完整路径!!!

例如:

实际的PHP路径要以自己的为准

/####/####/php/72/bin/php /home/admin/web/####/###.php

我的 Python 代码

import os


def main():

    stream = os.popen("C:/Users/Administrator/Desktop/php/xxx/xxx/php/php7.2.9nts/php  C:/xxx/xxx/WWW/test/test1.php")
    output = stream.read()
    print(output) # Successful and effective execution

if __name__ == '__main__':
    main()

【讨论】:

  • 将php路径添加到系统环境变量中,不需要指定完整路径
  • 尝试将路径更改为我的代码,但在 aws lambda 中显示错误“/bin/sh: /usr/bin/php: No such file or directory”。
  • 需要判断php是否安装成功,定位php安装路径。你是怎么安装php的?
  • 好的,php 是通过 putty 客户端使用 ssh > aws cli 安装的。无论它是否成功安装,是的,它的工作,我的整个应用程序当前都在线执行 php 命令。关于 php 安装路径,如果我是对的,可能是在 /usr/bin/php74/
  • 对不起,我对aws lambda不是很熟悉,希望下面的文章可以帮助到你,如果最后还是不能解决问题,可以考虑http请求api的方式和php交互https://forums.aws.amazon.com/thread.jspa?threadID=326841https://www.saltycrane.com/blog/2011/04/how-use-bash-shell-python-subprocess-instead-binsh/
猜你喜欢
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2016-09-28
相关资源
最近更新 更多