Comencé por este agujero del conejo como un medio para familiarizarme con cómo se crearía un script de configuración en Python. La elección de Python simplemente se basó en mi familiaridad con él, mientras que estoy seguro de que habría mejores alternativas que Python para esta tarea.
El objetivo de este script era instalar ROS en la máquina que ejecuta el script y también configurar el entorno catkin. Las instrucciones se pueden encontrar aquí y aquí , respectivamente.
El script tal como está actualmente es el siguiente:
subprocess.call(["sudo", "sh", "-c", "'echo \"deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main\" > /etc/apt/sources.list.d/ros-latest.list'"])
subprocess.call(["sudo", "apt-key", "adv", "--keyserver", "hkp://ha.pool.sks-keyserver.net:80", "--recv-key", "0xB01FA116"])
subprocess.call(["sudo", "apt-get", "update"])
subprocess.call(["sudo", "apt-get", "install", "ros-kinetic-desktop-full", "-y"])
subprocess.call(["sudo", "rosdep", "init"])
subprocess.call(["rosdep", "update"])
subprocess.call(["echo", '"source /opt/ros/kinetic/setup.bash"', ">>", "~/.bashrc", "source", "~/.bashrc"])
subprocess.call(["sudo", "apt-get", "install", "python-rosinstall", "-y"])
mkdir_p(os.path.expanduser('~') + "/catkin_ws/src")
subprocess.call(["(cd "+ os.path.expanduser('~') + "/catkin_ws/src)"])
subprocess.call(["(cd "+ os.path.expanduser('~') + "/catkin_ws && catkin_make)"])
subprocess.call(["(cd "+ os.path.expanduser('~') + "/catkin_ws && source devel/setup.bash"])
Cuando la secuencia de comandos se ejecuta actualmente, se produce un error con el error:
Traceback (most recent call last):
File "setup.py", line 46, in <module>
subprocess.call(["(cd "+ os.path.expanduser('~') + "/catkin_ws/src)"])
File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
He verificado que el comando funciona correctamente cuando se ejecuta manualmente desde una ventana de terminal y, como tal, creo que este es un malentendido fundamental sobre cómo se maneja este script y su alcance dentro del sistema operativo. La parte que me está causando mucha confusión es por qué se queja de que no puede localizar el directorio proporcionado, mientras que he verificado que este directorio existe. Cuando el comando se imprime desde Python y se pega en una ventana de terminal, no se encuentran errores.
cwd
argumento acall
os.chdir()