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

时间:2013-03-05 01:38:34

标签: php python 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

有人可以帮我解决问题吗?

5 个答案:

答案 0 :(得分:4)

您的代码或PHP的问题

问题在于您的权限。

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

理想情况下设置为:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

在你的apache2 / httpd conf文件下。

例如:

尝试跑步:

<?= `whoami` ?>

通过您的shell和浏览器。

您的浏览器可能会说www-data和shell会说出您的用户名,或者如果您在AWS上 - 默认情况下,您会得到root

您不必使用system(),而是使用exec()

我们应该接近:

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

执行操作将要求您设置正确的用户和组。

查找:In the shell, what does " 2>&1 " mean?

所以你的代码应该是:

echo json_encode(exec("python --version 2>&1"));

希望它有所帮助!

答案 1 :(得分:1)

这适用于我的生产服务器

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

输出

Python 2.7.3
"Python 2.7.3"

unix命令的输出打印两次,因为system()本身将结果输出到浏览器。所以exec()可以用在系统的位置来避免这种情况。

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

输出

"Python 2.7.3"

正如所料。

答案 2 :(得分:0)

我怀疑它不在路上。尝试:

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

  1. 使用'which python'

  2. 命令查找
  3. 尝试从命令行执行脚本'php script.php'=&gt;有时候网络     服务器设置不同的东西

  4. 确保使用

    启用错误显示

    的ini_set( '的display_errors',1);

答案 3 :(得分:0)

系统仅返回最后一行。 system

public function deploy_test() {

      system("python --version", $out);
      echo json_encode(implode($out));
 }

答案 4 :(得分:0)

这有点破解,但是你可以找到带有1位小数的版本号,即使你不允许执行python(“用户”CI就是这种情况)。

//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;