PHP 作为进程生成时未找到 ROS catkin_init_workspace
ROS catkin_init_workspace not found when spawned as process by PHP
让我详细说明:我正在尝试使用 proc_open[从 PHP 生成 catkin_init_workspace 像这样:
touch( "$dir/stderr.txt" );
chmod( "$dir/stderr.txt", 0755 );
$fp = fopen("$dir/stderr.txt", "w");
fclose($fp);
$descr = array(
0 => array("pipe", 'r'), // stdin
1 => array("pipe", 'w'), // stdout
2 => array("file", "$dir/stderr.txt", "w")to file
);
$pid = proc_open( "catkin_init_workspace", $descr, $pipes, $dir );
if (!is_resource( $pid) )
throw new Exception ( "`catkin_init_workspace` exec failed");
else if ( is_resource( $pid ) )
{
fclose( $pipes[1] );
$retval = proc_close( $pid );
}
以上代码适用于 CMake、GCC 和其他应用程序。
但是,当我使用 catkin_init_workspace 尝试此操作时,我得到:
sh: 1: catkin_init_workspace: not found
现在,据我了解,catkin_init_workspace 是一个 python 脚本,位于:
/opt/ros/indigo/bin/catkin_init_workspace
我尝试使用绝对路径直接调用它,但是没有用。
作为用户,一切正常。但不是当我通过 www-data 执行时,Apache2 的 user/group 设置。
ROS 教程说明我需要设置环境变量,运行
source /opt/ros/indigo/setup.bash
在我调用 proc_open 之前,我也尝试通过 PHP 执行此操作,但无济于事。
我的理解是我需要正确设置环境变量。
正在做
export | grep ROS
显示:
declare -x ROSLISP_PACKAGE_DIRECTORIES="/home/alex/Projects/ros_ws/devel/share/common-lisp"
declare -x ROS_DISTRO="indigo"
declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros"
declare -x ROS_MASTER_URI="http://localhost:11311"
declare -x ROS_PACKAGE_PATH="/home/alex/Projects/ros_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks"
declare -x ROS_ROOT="/opt/ros/indigo/share/ros"
declare -x ROS_TEST_RESULTS_DIR="/home/alex/Projects/ros_ws/build/test_results"
这些是我需要为 www-data 正确调用 catkin 设置的环境变量吗?
如果是这样,我如何将 env 数组传递给 PHP 的 proc_open 那些变量?
如您所知,source /opt/ros/indigo/setup.bash
必须提前调用,否则您的环境无法找到 ROS 命令。
当你在 PHP 中这样做时,我猜你在调用 proc_open("catkin_init_workspace", ...)
之前使用了额外的 proc_open
或 exec
调用或类似的东西?
通过这样做,环境可能只为这个单一的呼叫设置,并且直到你 运行 catkin_init_workspace
在另一个 proc_open
-call.
可能的解决方案
我现在不能在这里测试这个(没有安装 PHP),但是下面应该可以工作:
创建一个包含以下内容的简单 bash 脚本:
#!/bin/bash
source /opt/ros/indigo/setup.bash
catkin_init_workspace
- 在 PHP 中调用此脚本而不是
catkin_init_workspace
让我详细说明:我正在尝试使用 proc_open[从 PHP 生成 catkin_init_workspace 像这样:
touch( "$dir/stderr.txt" );
chmod( "$dir/stderr.txt", 0755 );
$fp = fopen("$dir/stderr.txt", "w");
fclose($fp);
$descr = array(
0 => array("pipe", 'r'), // stdin
1 => array("pipe", 'w'), // stdout
2 => array("file", "$dir/stderr.txt", "w")to file
);
$pid = proc_open( "catkin_init_workspace", $descr, $pipes, $dir );
if (!is_resource( $pid) )
throw new Exception ( "`catkin_init_workspace` exec failed");
else if ( is_resource( $pid ) )
{
fclose( $pipes[1] );
$retval = proc_close( $pid );
}
以上代码适用于 CMake、GCC 和其他应用程序。 但是,当我使用 catkin_init_workspace 尝试此操作时,我得到:
sh: 1: catkin_init_workspace: not found
现在,据我了解,catkin_init_workspace 是一个 python 脚本,位于:
/opt/ros/indigo/bin/catkin_init_workspace
我尝试使用绝对路径直接调用它,但是没有用。
作为用户,一切正常。但不是当我通过 www-data 执行时,Apache2 的 user/group 设置。
ROS 教程说明我需要设置环境变量,运行
source /opt/ros/indigo/setup.bash
在我调用 proc_open 之前,我也尝试通过 PHP 执行此操作,但无济于事。 我的理解是我需要正确设置环境变量。
正在做
export | grep ROS
显示:
declare -x ROSLISP_PACKAGE_DIRECTORIES="/home/alex/Projects/ros_ws/devel/share/common-lisp"
declare -x ROS_DISTRO="indigo"
declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros"
declare -x ROS_MASTER_URI="http://localhost:11311"
declare -x ROS_PACKAGE_PATH="/home/alex/Projects/ros_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks"
declare -x ROS_ROOT="/opt/ros/indigo/share/ros"
declare -x ROS_TEST_RESULTS_DIR="/home/alex/Projects/ros_ws/build/test_results"
这些是我需要为 www-data 正确调用 catkin 设置的环境变量吗?
如果是这样,我如何将 env 数组传递给 PHP 的 proc_open 那些变量?
如您所知,source /opt/ros/indigo/setup.bash
必须提前调用,否则您的环境无法找到 ROS 命令。
当你在 PHP 中这样做时,我猜你在调用 proc_open("catkin_init_workspace", ...)
之前使用了额外的 proc_open
或 exec
调用或类似的东西?
通过这样做,环境可能只为这个单一的呼叫设置,并且直到你 运行 catkin_init_workspace
在另一个 proc_open
-call.
可能的解决方案
我现在不能在这里测试这个(没有安装 PHP),但是下面应该可以工作:
创建一个包含以下内容的简单 bash 脚本:
#!/bin/bash source /opt/ros/indigo/setup.bash catkin_init_workspace
- 在 PHP 中调用此脚本而不是
catkin_init_workspace