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': [
],
},
)