我正在尝试使用以下命令从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
,system
。但是,如果我跑
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
它完全正常,而shutdown now
没有做任何事情。
PHP具有访问和执行文件的权限。
编辑:感谢亚历杭德罗,我能够解决问题。如果您遇到同样的问题,请不要忘记您的网络服务器可能/希望不会以root用户身份运行。 尝试以网络服务器的用户或具有类似权限的用户身份登录,并尝试自行运行命令。答案 0 :(得分:131)
在Ubuntu Server 10.04上测试。我希望它对Arch Linux也有帮助。
在PHP use shell_exec function中:
通过shell执行命令并将完整输出作为字符串返回。
它返回执行命令的输出,如果是错误则返回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文件must have correct privileges(如果PHP脚本在浏览器或卷曲中运行,则执行用户www-data / apache)
和/或必须是“可执行的”。此外,.py
文件中的所有命令都必须具有正确的权限:
快速提醒那些尝试在shell上使用shell_exec的人 unix型平台似乎无法让它工作。 PHP执行为 系统上的Web用户(通常是Apache的www),所以你需要 确保Web用户拥有任何文件或权限 您尝试在shell_exec命令中使用的目录。 另外,它似乎没有做任何事情。
致make executable a file on unix-type platforms:
chmod +x myscript.py
答案 1 :(得分:20)
我建议使用passthru
并直接处理输出缓冲区:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
答案 2 :(得分:13)
如果您想知道命令的返回状态并获得整个stdout
输出,可以实际使用exec
:
$command = 'ls';
exec($command, $out, $status);
$out
是所有行的数组。 $status
是返回状态。对调试非常有用。
如果您还希望看到stderr
输出,则可以使用proc_open或只是将2>&1
添加到$command
。后者通常足以让事情变得更加“快速”以实现“实施”。
答案 3 :(得分:9)
sudoers文件:
sudo visudo
例外情况:
www-data ALL=(ALL) NOPASSWD: ALL
答案 4 :(得分:3)
在我的情况下,我需要在名为www
的{{1}}目录中创建一个新文件夹。在scripts
内,我添加了一个名为scripts
的新文件。
然后我使用了test.py
和sudo chown www-data:root scripts
。
然后我转到了新的sudo chown www-data:root test.py
目录并使用了scripts
。
我的test.py文件看起来像这样。请注意不同的Python版本:
sudo chmod +x test.py
从php我现在这样做:
#!/usr/bin/env python3.5
print("Hello World!")
你应该看到:Hello World!
答案 5 :(得分:3)
根据情况明确使用哪个命令
exec()
-执行外部程序
system()
-执行外部程序并显示输出
passthru()
-执行外部程序并显示原始输出
答案 6 :(得分:2)
上述方法似乎很复杂。用我的方法作为参考。
我有这两个文件:
run.php
mkdir.py
在这里,我创建了一个HTML页面,其中包含一个 GO 按钮。每当您按下此按钮时,都会在您提到其路径的目录中创建一个新文件夹。
run.php
<html>
<body>
<head>
<title>
run
</title>
</head>
<form method="post">
<input type="submit" value="GO" name="GO">
</form>
</body>
</html>
<?php
if(isset($_POST['GO']))
{
shell_exec("python /var/www/html/lab/mkdir.py");
echo"success";
}
?>
mkdir.py
#!/usr/bin/env python
import os
os.makedirs("thisfolder");
答案 7 :(得分:1)
这是微不足道的,但只是想帮助那些已经遵循亚历杭德罗的建议但遇到这个错误的人:
sh:blabla.py:找不到命令
如果有人遇到这个错误,那么Alejandro需要对php文件做一点改动:
$command = escapeshellcmd('python blabla.py');
答案 8 :(得分:1)
受亚历杭德罗·奎罗兹(Alejandro Quiroz)的启发:
<?php
$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;
?>
需要添加Python,不需要路径。
答案 9 :(得分:0)
以上所有选项都会创建新的系统进程。这是一场表演梦night。 为此,我将PHP模块与对Python的“透明”调用结合在一起了。
https://github.com/kirmorozov/runpy
编译可能很棘手,但是可以节省系统进程,并使您可以在两次PHP调用之间保持Python运行时。