从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
。 后者往往足以让事情工作,并更快地“实施”。