【问题标题】:PHP exec(): Running bash script to configure environment then executing Python programPHP exec():运行 bash 脚本来配置环境然后执行 Python 程序
【发布时间】:2013-11-13 01:38:30
【问题描述】:

Shell 是 tcsh。 PHP v5.1.6。红帽 5.7。安全模式已关闭。

使用 exec 从浏览器运行 php 脚本到:

  1. 通过 bash 脚本上的 source 命令配置环境
  2. 依赖 bash 脚本设置的环境运行 python 程序(程序输出到 STDOUT)

这可以从命令行运行 ($shell = tcsh):

/bin/bash -c "source /path-to-config-bash-script/config.sh; /bin/path-to-python /path-to-python-program/prog.py 2>&1"

这不是。 Python程序返回错误提示环境设置不正确(找不到某些库等):

<?php
....
$cmd = "/bin/bash -c \"source /path-to-config-bash-script/config.sh; /bin/path-to-python /path-to-python-program/prog.py 2>&1\"";
$ret_val = exec( $cmd, $ret_arr, $err );
?>

四重检查权限,一切正常。

谢谢!

【问题讨论】:

    标签: php linux bash shell


    【解决方案1】:

    有四点需要注意。

    1 - PHP 不得开启 safe_mode 以利用 exec()

    2 - shell 脚本脚本需要在文件顶部声明#!/bin/bash,而不是传递到exec()

    3 - python 脚本必须在脚本顶部有#!/usr/bin/python,而不是尝试通过exec() 语句执行它。

    4 - 为访问脚本而遍历的所有目录必须是可读的。

    所以最终应该是这样的:

    $cmd = "/path-to-config-bash-script/config.sh; /path/to-python/program/prog.py 2>&1";
    

    这应该可以解决您的所有问题。

    【讨论】:

    • 谢谢,但由于多种原因,您的建议不起作用。
    • 对不起,我超过了 5 分钟的编辑限制...首先,shell 脚本必须是“源代码”,因为其中的导出需要持久化,以便 python 程序调用可以使用它们紧随其后。其次,默认 shell 是 tcsh,因此整个命令字符串需要在 bash 调用中执行。当脚本作为当前运行的 shell 以外的 shell 执行时,“./”和“source”是不一样的(尤其是使用“export”命令)。
    • exec("/bin/bash -c 'source /path-to-config-bash-script/config.sh; /bin/path-to-python /path-to-python-program /prog.py 2>&1'", $out_arr, $err_arr);从命令行 php 运行它时工作。所以至少我有这样的想法......但是,当通过 apache 调用时,源部分仍然失败。
    猜你喜欢
    • 2015-02-23
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多