从 PHP 运行 Python 脚本

2022-08-30 06:54:17

我正在尝试使用以下命令从PHP运行Python脚本:

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

但是,PHP根本不会产生任何输出。错误报告设置为E_ALL,并且display_errors处于打开状态。

以下是我尝试过的方法:

  • 我使用了 ,而不是python2/usr/bin/python2python2.7/usr/bin/python2.7
  • 我还使用了相对路径而不是绝对路径,这也不会改变任何东西。
  • 我尝试使用命令 , , .execshell_execsystem

但是,如果我运行

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

它工作得很好,同时不做任何事情。shutdown now

PHP 具有访问和执行该文件的权限。

编辑:多亏了亚历杭德罗,我才能够解决这个问题。如果您有同样的问题,请不要忘记您的Web服务器可能/希望不会以root身份运行。尝试以 Web 服务器用户或具有类似权限的用户身份登录,并尝试自己运行命令。


答案 1

在 Ubuntu Server 10.04 上测试。我希望它也能帮助你在Arch Linux上。

在 PHP 中使用shell_exec函数

通过 shell 执行命令,并以字符串形式返回完整输出。

它返回已执行命令的输出,如果发生错误或命令不生成任何输出,则返回 NULL。

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

进入Python文件,验证第一行中的此文本:(请参阅shebang说明)test.py

#!/usr/bin/env python

如果你安装了多个版本的 Python,/usr/bin/env 将确保使用的解释器是环境$PATH的第一个解释器。另一种方法是硬编码像#!/usr/bin/python这样的东西;没关系,但不太灵活。

在Unix中,要解释的可执行文件可以通过#!在第一行的开头,然后是解释器(以及可能需要的任何标志)。

当然,如果你在谈论其他平台,这个规则不适用(但是“shebang line”没有害处,如果你将该脚本复制到具有Unix基础的平台,如Linux,Mac等),这将有所帮助)。

当您在Unix中运行它时,这适用,方法是使其可执行(chmod +x myscript.py),然后直接运行它:./myscript.py,而不仅仅是python myscript.py

使可执行文件成为 unix 类型的文件::

chmod +x myscript.py

此外,Python文件必须具有正确的权限(如果PHP脚本在浏览器或curl中运行,则为用户www-data / apache执行)和/或必须是“可执行的”。此外,文件中的所有命令都必须具有正确的权限。.py

摘自 php 手册

对于那些试图在unix类型的平台上使用shell_exec的人来说,这只是一个快速的提醒,似乎无法让它工作。PHP在系统上以Web用户身份执行(通常为apache的www),因此您需要确保Web用户有权访问您尝试在shell_exec命令中使用的任何文件或目录。其他明智的做法是,它似乎不会做任何事情。


答案 2

我建议直接使用和处理输出缓冲区:passthru

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 

推荐