使用 PHP 运行带参数的 Python 函数

Posted

技术标签:

【中文标题】使用 PHP 运行带参数的 Python 函数【英文标题】:Run Python function with arguments using PHP 【发布时间】:2021-11-08 19:21:54 【问题描述】:

我的目标是通过单击 html(php) 按钮运行具有不同参数的不同 Python 函数。 当我在终端中执行命令时,一切正常(灯亮)

# terminal
python3 -c 'from lights import *; lights.turn_on_group("bath")'

但是当我尝试在 PHP 中运行相同的命令时,什么也没有发生(空白页)。

# test.php

$cmd = "python3 -c 'from lights import *; lights.turn_on_group(\"bath\")'";
$command = escapeshellcmd($cmd);
$output = shell_exec($command);

有人知道如何解决这个问题吗?

【问题讨论】:

你能把这个print "<pre>$output</pre>";代码添加到php文件中,这样我们就可以清楚地看到它是什么问题了。 @Orhan 有一个空输出 -> "
"
【参考方案1】:

您的问题是由于escapeshellcmd($cmd) 语句引起的,正如here 所解释的那样,由于安全原因,您的命令分隔符被转义,因此 shell 无法解释,现在您有两个选项

选项 1

删除该语句或根本不转义您的命令,在您的情况下它是安全的,因为您正在执行硬编码命令而不是从用户那里获取的命令。所以没有必要逃避它。

例子

$cmd = "python3 -c 'from lights import *; lights.turn_on_group(\"bath\")'";
$output = shell_exec($cmd);

选项 2

以防万一您太愿意实施标准并使用该功能,然后将您的代码包装到单个 python 脚本中,例如myLights.py 然后用参数调用你的脚本,因为不需要命令分隔符!

示例myLights.py

import sys
from lights import *

if len(sys.argv) > 1:
    lights.turn_on_group(sys.argv[1])
    print('lights turned on')
else
    print('No input received')

然后叫它

python3 myLights.py bath

例如

$cmd = "python3 myLights.py bath";
$command = escapeshellcmd($cmd); #no special characters it will work
$output = shell_exec($command);

我建议您使用此方法,因为您将在安全层处于活动状态的单个命令行调用中添加更多自定义项和选项。

【讨论】:

非常感谢!

以上是关于使用 PHP 运行带参数的 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章

python 带参与不带参装饰器的使用

Python虚拟机函数机制之位置参数

帮忙看下这个带参的宏定义,看不懂?

AS 3.0事件处理函数带参实现方法

宏定义与内联函数

默认构造函数嵌套带参构造函数