从PHP运行Python脚本

从PHP运行Python脚本,php,python,linux,exec,archlinux,Php,Python,Linux,Exec,Archlinux,我正在尝试使用以下命令从PHP运行Python脚本: exec('/usr/bin/python2.7/srv/http/assets/py/switch.pyarg1 arg2') 然而,PHP根本不产生任何输出。错误报告设置为E_ALL,并且“显示错误”处于启用状态 以下是我尝试过的: 我使用了python2、/usr/bin/python2和python2.7而不是/usr/bin/python2.7 我还使用了相对路径而不是绝对路径,这也不会改变任何东西 我尝试使用命令exec,she

我正在尝试使用以下命令从PHP运行Python脚本:

exec('/usr/bin/python2.7/srv/http/assets/py/switch.pyarg1 arg2')

然而,PHP根本不产生任何输出。错误报告设置为E_ALL,并且“显示错误”处于启用状态

以下是我尝试过的:

  • 我使用了
    python2
    /usr/bin/python2
    python2.7
    而不是
    /usr/bin/python2.7
  • 我还使用了相对路径而不是绝对路径,这也不会改变任何东西
  • 我尝试使用命令
    exec
    shell\u exec
    system
但是如果我跑

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}
它可以很好地工作,而
立即关闭
没有任何作用

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


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

在Ubuntu服务器10.04上测试。我希望它在ArchLinux上也能帮助您

在PHP中:

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

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

如果安装了多个版本的Python,/usr/bin/env将 确保使用的解释器是您环境的 $PATH。另一种选择是硬编码,比如 #!/usr/bin/python;没关系,但灵活性较低

在Unix中,要解释的可执行文件可以指示 有一个#使用什么样的解释器!在第一行的开头, 后跟解释器(以及它可能需要的任何标志)

当然,如果你说的是其他平台,这条规则并不适用 应用(但“shebang行”并没有坏处,如果你有机会,它也会有帮助 将该脚本复制到基于Unix的平台,如Linux, Mac等)

这适用于在Unix中通过使其可执行来运行它 (chmod+x myscript.py),然后直接运行它:./myscript.py, 而不仅仅是python myscript.py

致:

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

采取:

这只是一个简短的提醒,提醒那些试图在计算机上使用shell_exec的人 unix类型的平台,并且似乎无法使其工作。PHP执行为 系统上的web用户(通常是Apache的www),因此您需要 确保web用户有权访问任何文件或文件 您试图在shell_exec命令中使用的目录。 另一方面,它似乎什么也没做


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

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

Alejandro抓住了这一点,为例外添加了澄清(Ubuntu或Debian)-我没有代表来补充答案本身:

sudoers文件:
sudo-visudo

添加的例外情况:
www-data-ALL=(ALL)NOPASSWD:ALL
如果您想知道命令的返回状态并获得整个
stdout
输出,您可以实际使用
exec

$command = 'ls';
exec($command, $out, $status);
$out
是所有行的数组<代码>$status
是返回状态。对调试非常有用


如果您还想查看
stderr
输出,您可以使用
2>&1
或将
添加到
$命令中。后者通常足以让事情运转起来,并以更快的方式“实现”。

在我的例子中,我需要在
www
目录中创建一个名为
scripts
的新文件夹。在
scripts
中,我添加了一个名为
test.py
的新文件

然后我使用了
sudo-chown www-data:root脚本
sudo-chown-www-data:root-test.py

然后我转到新的
scripts
目录并使用
sudo chmod+x test.py

我的test.py文件看起来像这样。请注意不同的Python版本:

#!/usr/bin/env python3.5
print("Hello World!")
从php中,我现在可以执行以下操作:

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);

你应该看到:你好,世界

这太微不足道了,但只是想帮助那些已经听从亚历杭德罗建议但遇到错误的人:

sh:blabla.py:未找到命令

如果有人遇到该错误,那么Alejandro需要对php文件进行一些更改:

$command = escapeshellcmd('python blabla.py');

上述方法似乎很复杂。用我的方法作为参考

我有两个文件:

  • run.php

  • mkdir.py

在这里,我创建了一个包含GO按钮的HTML页面。无论何时按下此按钮,都会在您提到的目录中创建一个新文件夹

run.php


根据情况明确使用哪个命令

exec()
-执行外部程序

system()
-执行外部程序并显示输出

passthru()
-执行外部程序并显示原始输出


来源:

灵感来源于亚历杭德罗·奎罗斯:

<?php 

$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;

?>


需要添加Python,不需要路径。

以上所有选项都会创建新的系统进程。这是一场表演噩梦。 为此,我将PHP模块与对Python的“透明”调用缝合在一起


编译起来可能很棘手,但它可以保存系统进程,并让您在PHP调用之间保持Python运行时。

谢谢,这就成功了!还有一个问题——Apache用户无法在Python脚本中执行命令,但我可以通过使用sudo并在sudo中添加脚本的异常来解决这个问题
$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);
$command = escapeshellcmd('python blabla.py');
<?php 

$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;

?>