首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从PHP运行Python脚本

从PHP运行Python脚本
EN

Stack Overflow用户
提问于 2013-11-02 04:54:21
回答 9查看 393.9K关注 0票数 136

我正在尝试使用以下命令从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
  • I也使用相对路径而不是绝对路径,这也不会改变任何东西。
  • 我尝试使用命令execshell_exec

但是,如果我运行

代码语言:javascript
复制
if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

它工作得很好,而shutdown now什么也不做。

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

编辑:多亏了Alejandro,我才能解决这个问题。如果你有同样的问题,不要忘记你的the服务器可能/希望不是以root用户身份运行的。尝试以and服务器用户或具有类似权限的用户身份登录,并尝试自己运行这些命令。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-11-02 06:34:59

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

在PHP use shell_exec function

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

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

代码语言:javascript
复制
<?php 

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

?>

在Python文件test.py中,验证第一行中的文本:(see shebang explain)

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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命令中使用的任何文件或目录。否则,它看起来什么也做不了。

票数 192
EN

Stack Overflow用户

发布于 2013-11-02 06:38:28

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

代码语言:javascript
复制
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 
票数 28
EN

Stack Overflow用户

发布于 2015-09-19 02:19:01

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

代码语言:javascript
复制
$command = 'ls';
exec($command, $out, $status);

$out是由所有行组成的数组。$status为返回状态。对调试非常有用。

如果您还想查看stderr输出,您可以使用proc_open或简单地将2>&1添加到您的$command。后者通常足以让事情正常工作,并以更快的速度“实现”。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19735250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档