Python package add folder

ROS2. Añadiendo carpetas adicionales a nuestro paquete Python

En muchas ocasiones necesitamos añadir carpetas adicionales a las que inicialmente se generan cuando creamos un paquete Python. Por ejemplo es muy habitual incluir carpetas como launch o config.

Sin embargo, si simplemente creamos dichas carpetas, estas no se incluirán de forma automática en la instalación del paquete al compilarlo. 

Para ello hace falta modificar el archivo setup.py del mismo, concretamente la parte del código que afecta a la variable data_files

    data_files=[
        ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],

data_files especifica una lista de pares ( directorio_destino , [ lista_archivos ] ) donde cada par indica el directorio de instalación y los archivos para instalar allí. Debe tenerse en cuenta que:

    • directorio_destino es una ruta relativa al directorio de instalación install del espacio de trabajo.
    • lista_archivos es una lista donde cada elemento es una ruta a un archivo relativa a la ubicación donde se encuentre setup.py.

Una forma de incorporar a la instalación por ejemplo todos los archivos .yaml que tenemos en una carpeta config es usar el comando glob, añadiendo la siguiente línea a data_files

    data_files=[
        ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        (os.path.join('share', package_name, 'config'), glob('config/*.yaml')),
    ],

Sin embargo, si la carpeta config tuviera a su vez subcarpetas esta forma no nos sirve. 

A continuación se muestra cómo podemos modificar el archivo setup.py añadiendo una función, que he llamado package_files, a la cual le pasamos el contenido inicial de data_files así como una lista con las carpetas que queramos incluir en la instalación y nos devuelve todos los pares ( directorio_destino , [lista_archivos] ) necesarios.

import os
from glob import glob
from setuptools import setup

package_name = 'check_joints'

data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ]


def package_files(data_files, directory_list):

    paths_dict = {}

    for directory in directory_list:

        for (path, directories, filenames) in os.walk(directory):

            for filename in filenames:

                file_path = os.path.join(path, filename)
                install_path = os.path.join('share', package_name, path)

                if install_path in paths_dict.keys():
                    paths_dict[install_path].append(file_path)

                else:
                    paths_dict[install_path] = [file_path]

    for key in paths_dict.keys():
        data_files.append((key, paths_dict[key]))

    return data_files


setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=package_files(data_files, ['config', 'launch']),
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='ros',
    maintainer_email='ros@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)
Comparte este artículo:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *