从PHP运行Python脚本

我试图从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
  • 我也使用了相对path,而不是绝对path,也没有改变任何东西。
  • 我尝试使用命令execshell_execsystem

但是,如果我运行

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

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

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

编辑:感谢亚历杭德罗,我能够解决这个问题。 如果你有同样的问题,不要忘记你的networking服务器很可能/不希望以root身份运行。 尝试以您的networking服务器用户或具有相似权限的用户身份login,并尝试自行运行这些命令。

在Ubuntu Server 10.04上testing 我希望它可以帮助你Arch Linux。

在PHP中:

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

在Python文件'test.py'中validation这个文本的第一行: (see shebang explain) :

 #!/usr/bin/env python 

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

 chmod +x myscript.py 

我build议使用passthru并直接处理输出缓冲区:

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

亚历杭德罗钉了它,增加了例外(Ubuntu或Debian)澄清 – 我没有代表添加到答案本身:

sudoers文件: sudo visudo

例外: www-data ALL=(ALL) NOPASSWD: ALL

如果你想知道命令的返回状态,并获得整个stdout输出,你可以使用exec

 $command = 'ls'; exec($command, $out, $status); 

$out是所有行的数组。 $status是返回状态。 非常有用的debugging。

如果你也想看stderr输出,你可以用proc_open来玩,或者直接在你的$command添加2>&1 。 后者往往足以让事情工作,并更快地“实施”。