在控制器内的命令行中执行python - PHP/CodeIgniter


executing python in the command line inside a controller - PHP/CodeIgniter

在我的automation.php控制器中,我有以下功能:

public function deploy_test() {
      echo json_encode(system("python --version"));
 }

当用户想要部署测试时,通过单击网页中的test按钮,他将能够完成这样的任务。然而,当我点击test按钮时,我的输出是:

""

同时,当我用命令

执行相同的函数时:
public function deploy_test() {
    echo json_encode(system("ls -l"));
}

我:

total 32
drwxr-xr-x. 15 philippe philippe 4096 Mar  4 16:48 application
drwxrwxr-x.  2 philippe philippe 4096 Mar  4 17:28 css
-rw-r--r--.  1 philippe philippe 6357 Jan 30 11:53 index.php
drwxrwxr-x.  2 philippe philippe 4096 Feb 27 15:38 js
-rw-r--r--.  1 philippe philippe 2496 Jan 30 11:53 license.txt
drwxr-xr-x.  8 philippe philippe 4096 Jan 30 11:53 system
drwxr-xr-x. 12 philippe philippe 4096 Jan 30 11:53 user_guide
谁能帮我弄清楚吗?

问题是不是与您的代码或PHP。

问题出在你的权限上。

php使用的权限是在apache的env-vars中设置的。

理想设置为:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

在apache2/HTTPD配置文件下。

例如:

尝试运行:

<?= `whoami` ?>

通过你的shell和浏览器。

你的浏览器可能会显示www-data, shell会显示你的用户名,或者如果你使用AWS,默认会显示root

你不必用system(),用exec()代替。

我们应该接近:

echo json_encode(exec("python --version"));

执行操作需要设置正确的User和Groups。

查找:In the shell, what does "2祝辞,1";的意思吗?

所以你的代码应该是:
echo json_encode(exec("python --version 2>&1"));

希望有帮助!

这在我的生产服务器上运行良好

public function deploy_test() {
    echo json_encode(system("python --version 2>&1"));
}

输出

Python 2.7.3
"Python 2.7.3"

unix命令的输出打印两次,作为system()本身将结果输出给浏览器。因此,可以使用exec()代替system来避免这种情况。

public function deploy_test() {
    echo json_encode(exec("python --version 2>&1"));
}

输出
"Python 2.7.3"

我怀疑它不在路径中。试一试:

输入python命令的完整路径(如/usr/bin/python --version)

  1. 使用which, 'which python'命令查找

  2. 尝试从命令行执行您的脚本,'php script.php' =>有时web

  3. 确保错误显示已启用

    报错(' display_errors ', 1);

系统只返回最后一行。系统

public function deploy_test() {
      system("python --version", $out);
      echo json_encode(implode($out));
 }

这有点黑,但是即使你不允许执行python(这是'user' CI的情况),你也可以用1十进制找到版本号。

//find python path
exec("which python", $path);
//show all subdirs in python    
exec("ls -l ".$path[0]."*", $output);
$output = implode("'n", $output);
//preg match on version numbers    
preg_match_all("#python('d+(?:'.'d{1,2})?)#", $output , $matches);
$installed_versions = $matches[1];
//sort in reversing order
$versions_sorted_desc = array_reverse($installed_versions);
//latest version is element 0
$latest_version = $versions_sorted_desc[0];
echo $latest_version;