exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
但是,PHP根本不产生任何输出。错误报告设置为E_ALL,并且display_errors处于打开状态。
这是我尝试过的操作: />
我也使用了相对路径而不是绝对路径,也没有任何改变。
我尝试使用命令
python2
,/usr/bin/python2
,python2.7
。如果我运行if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
它可以正常工作,而
/usr/bin/python2.7
却不执行任何操作。 。编辑:感谢Alejandro,我得以解决此问题。如果您遇到相同的问题,请不要忘记您的网络服务器可能/希望不是以root用户身份运行。尝试以Web服务器的用户或具有类似权限的用户身份登录,然后尝试自己运行命令。
#1 楼
在Ubuntu Server 10.04上测试。我希望它也可以在Arch Linux上为您提供帮助。在PHP中使用shell_exec函数:
通过shell执行命令并以字符串形式返回完整的输出。 br />
它返回已执行命令的输出,如果发生错误
或命令不产生任何输出,则返回NULL。
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
在Python文件
test.py
中,请在第一行中验证以下文本:(请参见shebang解释): -data / apache(如果PHP脚本在浏览器或curl中运行)和/或必须是“可执行的”。同样,进入
.py
文件的所有命令都必须具有正确的特权:取自php手册:
对于那些试图在
上使用shell_exec的人来说,这只是一个简短的提醒。 unix型平台,似乎无法使其正常工作。 PHP以系统上的Web用户(通常是www,对于Apache)执行,因此您需要
确保Web用户对您要尝试访问的任何文件或目录具有权限在shell_exec命令中使用。
否则,它似乎没有任何作用。
在Unix类型平台上将可执行文件制作为文件:
#!/usr/bin/env python
评论
谢谢,成功了!还有一个问题-Apache用户无法在Python脚本中执行命令,但是我能够通过使用sudo并将脚本的异常添加到sudoers文件中来解决此问题。再次感谢! :)
–废弃的帐户
13年3月3日,11:40
我正面临着Apache用户的同样问题,能否请您指导我?
–艾玛
15年7月29日在9:11
我用你的答案,它可以很好地执行python脚本,但是我无法回显结果,网页上什么也没有出现,您能帮我吗。
– Hamdi Charef
16年8月18日在13:37
第一行上的“#!/ usr / bin / env python”对我有用。大!
– C3PO
18年1月27日在12:34
对于OSX:echo shell_exec(“ / usr / local / bin / python3 /Users/cyborg/Dev/magic.py”);或:echo shell_exec(“ / usr / bin / python /Users/cyborg/Dev/magic.py”);
–Cyborg
4月10日8:10
#2 楼
我建议使用passthru
并直接处理输出缓冲区:ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
#3 楼
如果要了解命令的返回状态并获取整个stdout
输出,则可以实际使用exec
:$command = 'ls';
exec($command, $out, $status);
$out
是所有行的数组。 $status
是返回状态。对于调试非常有用。后者通常足以使工作正常运行并更快地实现。#4 楼
亚历杭德罗(Alejandro)钉上了钉子,为异常(Ubuntu或Debian)添加了说明-我没有代表要添加到答案本身: br />添加了例外:sudo visudo
评论
向www.data添加到sudoers似乎并不有效,并且给apache更多所需的权限。对正在执行的脚本授予www-data权限就足够了。
–JasonRDalton
2014年7月31日在18:59
很酷的主意,但肯定会使您的系统容易受到攻击。我同意@JasonRDalton
–芦苇
2月26日21:09
#5 楼
根据情况确定要使用的命令exec()
-执行外部程序system()
-执行外部程序并显示输出passthru()
-执行外部程序并显示原始输出来源:http://php.net/manual/en/function.exec.php
#6 楼
就我而言,我需要在www
目录中创建一个名为scripts
的新文件夹。在scripts
中,我添加了一个名为test.py
的新文件。 然后我使用了
sudo chown www-data:root scripts
和sudo chown www-data:root test.py
。然后我进入了新的
scripts
目录,并使用了sudo chmod +x test.py
。像这样。请注意不同的Python版本:#!/usr/bin/env python3.5
print("Hello World!")
从php我现在要这样做:
$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);
,您应该请参阅:世界您好!
#7 楼
上述方法似乎很复杂。请使用我的方法作为参考。我有以下两个文件:
run.php
mkdir.py
在这里,我创建了一个包含GO按钮的HTML页面。每当您按下此按钮时,都会在您提到的路径目录中创建一个新文件夹。
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");
#8 楼
这很琐碎,但只是想帮助已经遵循Alejandro的建议但遇到此错误的任何人: >如果有人遇到该错误,则Alejandro需对php文件进行一些更改:
$command = escapeshellcmd('python blabla.py');
#9 楼
受Alejandro Quiroz的启发:<?php
$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;
?>
需要添加Python,不需要路径。
评论
这为我在共享主机上工作。
– Vishal Kumar Sahu
11月29日17:19
#10 楼
以上所有选项都会创建新的系统进程。这是一场性能梦night。为此,我将PHP模块与对Python的“透明”调用结合在一起。
https://github.com/kirmorozov/runpy
进行编译,但可以节省系统进程,并使您可以在两次PHP调用之间保持Python运行时。
评论
第一次访问此问题stackoverflow.com/questions/21659637/…如果不固定,并且遇到诸如万一您被导入卡住或tty或没有AskPass不起作用的问题,请检查此链接以获取执行它的详细步骤。 stackoverflow.com/a/57978771/9470457谢谢!!!