Позвольте мне уточнить: я пытаюсь породить catkin_init_workspace из PHP, используя proc_open вот так:
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.
Учебник по ROS объясняет, что мне нужно настроить переменные среды, запустив
source /opt/ros/indigo/setup.bash
Что я также пытался сделать через PHP, прямо перед тем, как вызвать proc_open, но безрезультатно.
Насколько я понимаю, мне нужно правильно настроить переменные среды.
дела
экспорт | 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-данных, чтобы правильно вызывать catkin?
Если да, то как мне передать массив переменных env в proc_open PHP, эти переменные?
Как вы уже поняли, source /opt/ros/indigo/setup.bash
должен быть вызван заранее, в противном случае ваша среда не настроена на поиск команд ROS.
Когда вы сделали это в PHP, я думаю, вы использовали что-то вроде дополнительного proc_open
или же exec
позвоните или что-то подобное, прежде чем позвонить proc_open("catkin_init_workspace", ...)
?
При этом среда, вероятно, настраивается только для этого единственного вызова и не сохраняется до тех пор, пока вы не запустите catkin_init_workspace
в другой proc_open
-вызов.
Я не могу проверить это здесь прямо сейчас (PHP не установлен), но следующее должно работать:
Создайте простой скрипт bash со следующим содержимым:
#!/bin/bash
source /opt/ros/indigo/setup.bash
catkin_init_workspace
catkin_init_workspace
Других решений пока нет …