我正在尝试使用以下命令从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
exec
,shell_exec
,但是,如果我运行
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
它工作得很好,而shutdown now
什么也不做。
PHP具有访问和执行该文件的权限。
编辑:多亏了Alejandro,我才能解决这个问题。如果你有同样的问题,不要忘记你的the服务器可能/希望不是以root用户身份运行的。尝试以and服务器用户或具有类似权限的用户身份登录,并尝试自己运行这些命令。
发布于 2013-11-02 06:34:59
在Ubuntu Server 10.04上测试。我希望它对你在Arch Linux上也有帮助。
在PHP use shell_exec function中
通过外壳执行命令,并以字符串形式返回完整的输出。
它返回已执行命令的输出,如果发生错误或命令不产生输出,则返回NULL。
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
在Python文件test.py
中,验证第一行中的文本:(see shebang explain)
#!/usr/bin/env python
如果您安装了Python的多个版本,/usr/bin/env将确保使用的解释器是您环境的$PATH上的第一个解释器。另一种选择是硬编码类似于#!/usr/bin/python的代码;这是可以的,但灵活性较差。
在Unix中,要解释的可执行文件可以通过一个#!来指示使用哪个解释器!在第一行的开头,后跟解释器(以及它可能需要的任何标志)。
当然,如果您正在谈论其他平台,则此规则不适用(但"shebang line“没有坏处,如果您将该脚本复制到具有Unix基础的平台,如Linux、Mac等,则会有所帮助)。这适用于在Unix中通过使其成为可执行文件(chmod +xmyscript.py),然后直接运行它时:./ myscript.py,而不仅仅是python myscript.py。
转到make executable a file on unix-type platforms
chmod +x myscript.py
还有Python文件must have correct privileges (如果PHP脚本在浏览器或curl中运行,则执行用户www-data / apache )和/或必须是“可执行文件”。此外,所有进入.py
文件的命令都必须具有正确的权限。
Taken from php manual
对于那些试图在unix类型的平台上使用
但似乎无法正常工作的人来说,shell_exec只是一个简单的提醒。PHP在系统上以web用户身份执行(对于Apache,通常是www ),因此您需要确保web用户有权访问您试图在shell_exec命令中使用的任何文件或目录。否则,它看起来什么也做不了。
发布于 2013-11-02 06:38:28
我建议使用passthru
并直接处理输出缓冲区:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
发布于 2015-09-19 02:19:01
如果您想知道命令的返回状态并获得整个stdout
输出,您可以实际使用exec
$command = 'ls';
exec($command, $out, $status);
$out
是由所有行组成的数组。$status
为返回状态。对调试非常有用。
如果您还想查看stderr
输出,您可以使用proc_open或简单地将2>&1
添加到您的$command
。后者通常足以让事情正常工作,并以更快的速度“实现”。
https://stackoverflow.com/questions/19735250
复制相似问题