从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/python2和python2.7代替/usr/bin/python2.7
- 我也使用了相对path,而不是绝对path,也没有改变任何东西。
-  我尝试使用命令exec,shell_exec,system。
但是,如果我运行
 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 。 后者往往足以让事情工作,并更快地“实施”。