当前位置: 首页 > news >正文

网站和网络有什么区别许昌哪个网站做苗木

网站和网络有什么区别,许昌哪个网站做苗木,学网站建设多少钱,如何做自己微网站文章目录 source setup.bashsetup.bashsetup.sh脚本的主要功能脚本的详细解释1. **初始化和检查**2. **检测操作系统**3. **设置环境变量**4. **记住 shell 类型**5. **调用 Python 脚本生成环境变量**6. **加载环境钩子**7. **清理** 总结 _setup_util.py_setup_util.py 的完整… 文章目录 source setup.bashsetup.bashsetup.sh脚本的主要功能脚本的详细解释1. **初始化和检查**2. **检测操作系统**3. **设置环境变量**4. **记住 shell 类型**5. **调用 Python 脚本生成环境变量**6. **加载环境钩子**7. **清理** 总结 _setup_util.py_setup_util.py 的完整功能解析文件结构与功能1. **全局变量和常量**2. **环境变量子目录映射**3. **命令行参数解析**4. **主程序逻辑** **主程序的主要步骤**关键函数解析1. **rollback_env_variables**2. **_rollback_env_variable**3. **_get_workspaces**4. **prepend_env_variables**5. **_prefix_env_variable**6. **find_env_hooks** 总结 source setup.bash 每次运行都需要source setup.bash不太懂这个文件干什么的就学习了一下。 setup.bash #!/usr/bin/env bash # generated from catkin/cmake/templates/setup.bash.inCATKIN_SHELLbash# source setup.sh from same directory as this file _CATKIN_SETUP_DIR$(builtin cd dirname ${BASH_SOURCE[0]} /dev/null pwd) . $_CATKIN_SETUP_DIR/setup.sh该文件就是调用setup.sh。 setup.sh #!/usr/bin/env sh # generated from catkin/cmake/template/setup.sh.in# Sets various environment variables and sources additional environment hooks. # It tries its best to undo changes from a previously sourced setup file before. # Supported command line options: # --extend: skips the undoing of changes from a previously sourced setup file # --local: only considers this workspace but not the chained ones # In plain sh shell which doesnt support arguments for sourced scripts you can # set the environment variable CATKIN_SETUP_UTIL_ARGS--extend/--local instead.# since this file is sourced either use the provided _CATKIN_SETUP_DIR # or fall back to the destination set at configure time : ${_CATKIN_SETUP_DIR:/home/ssmec/catkin_ws/devel} _SETUP_UTIL$_CATKIN_SETUP_DIR/_setup_util.py unset _CATKIN_SETUP_DIRif [ ! -f $_SETUP_UTIL ]; thenecho Missing Python script: $_SETUP_UTILreturn 22 fi# detect if running on Darwin platform _UNAMEuname -s _IS_DARWIN0 if [ $_UNAME Darwin ]; then_IS_DARWIN1 fi unset _UNAME# make sure to export all environment variables export CMAKE_PREFIX_PATH if [ $_IS_DARWIN -eq 0 ]; thenexport LD_LIBRARY_PATH elseexport DYLD_LIBRARY_PATH fi unset _IS_DARWIN export PATH export PKG_CONFIG_PATH export PYTHONPATH# remember type of shell if not already set if [ -z $CATKIN_SHELL ]; thenCATKIN_SHELLsh fi# invoke Python script to generate necessary exports of environment variables # use TMPDIR if it exists, otherwise fall back to /tmp if [ -d ${TMPDIR:-} ]; then_TMPDIR${TMPDIR} else_TMPDIR/tmp fi _SETUP_TMPmktemp ${_TMPDIR}/setup.sh.XXXXXXXXXX unset _TMPDIR if [ $? -ne 0 -o ! -f $_SETUP_TMP ]; thenecho Could not create temporary file: $_SETUP_TMPreturn 1 fi CATKIN_SHELL$CATKIN_SHELL $_SETUP_UTIL $ ${CATKIN_SETUP_UTIL_ARGS:-} $_SETUP_TMP _RC$? if [ $_RC -ne 0 ]; thenif [ $_RC -eq 2 ]; thenecho Could not write the output of $_SETUP_UTIL to temporary file $_SETUP_TMP: may be the disk if full?elseecho Failed to run \$_SETUP_UTIL\ $: return code $_RCfiunset _RCunset _SETUP_UTILrm -f $_SETUP_TMPunset _SETUP_TMPreturn 1 fi unset _RC unset _SETUP_UTIL . $_SETUP_TMP rm -f $_SETUP_TMP unset _SETUP_TMP# source all environment hooks _i0 while [ $_i -lt $_CATKIN_ENVIRONMENT_HOOKS_COUNT ]; doeval _envfile\$_CATKIN_ENVIRONMENT_HOOKS_$_iunset _CATKIN_ENVIRONMENT_HOOKS_$_ieval _envfile_workspace\$_CATKIN_ENVIRONMENT_HOOKS_${_i}_WORKSPACEunset _CATKIN_ENVIRONMENT_HOOKS_${_i}_WORKSPACE# set workspace for environment hookCATKIN_ENV_HOOK_WORKSPACE$_envfile_workspace. $_envfileunset CATKIN_ENV_HOOK_WORKSPACE_i$((_i 1)) done unset _iunset _CATKIN_ENVIRONMENT_HOOKS_COUNT这个脚本是 ROSRobot Operating System中 catkin 工作空间的 setup.sh 文件它的主要作用是设置和更新环境变量使得用户可以在当前终端会话中使用该工作空间中的工具、库和包。它还会处理一些复杂的环境配置例如确保多个工作空间之间的依赖关系正确以及撤销之前可能已经设置的其他工作空间的环境变量。 脚本的主要功能 设置环境变量脚本会设置一系列环境变量如 CMAKE_PREFIX_PATH、LD_LIBRARY_PATHLinux、DYLD_LIBRARY_PATHmacOS、PATH、PKG_CONFIG_PATH 和 PYTHONPATH。这些环境变量对于找到编译工具、库文件、可执行文件和其他资源非常重要。 处理多工作空间链ROS 支持多个 catkin 工作空间的叠加使用。每个工作空间可以依赖于其他工作空间中的包。setup.sh 会根据命令行参数如 --extend 和 --local来决定是否覆盖或扩展已有的环境变量。--extend 参数允许当前工作空间的环境变量与之前工作空间的环境变量共存而 --local 参数则只考虑当前工作空间忽略链中的其他工作空间。 调用 Python 脚本生成环境变量脚本会调用一个 Python 脚本 _setup_util.py 来生成必要的环境变量导出命令。这个 Python 脚本会根据当前工作空间的状态动态生成正确的环境变量设置并将结果写入一个临时文件。然后setup.sh 会读取并执行这个临时文件中的命令。 加载环境钩子catkin 允许包提供“环境钩子”environment hooks即一些额外的脚本用于在 setup.sh 执行时进一步修改环境。这些钩子可以用来设置特定包所需的环境变量或其他配置。setup.sh 会遍历所有找到的环境钩子并依次执行它们。 处理平台差异脚本会检测当前操作系统如 Linux 或 macOS并根据平台的不同设置相应的环境变量。例如在 Linux 上设置 LD_LIBRARY_PATH而在 macOS 上设置 DYLD_LIBRARY_PATH。 脚本的详细解释 1. 初始化和检查 : ${_CATKIN_SETUP_DIR:/home/ssmec/catkin_ws/devel} _SETUP_UTIL$_CATKIN_SETUP_DIR/_setup_util.py unset _CATKIN_SETUP_DIRif [ ! -f $_SETUP_UTIL ]; thenecho Missing Python script: $_SETUP_UTILreturn 22 fi这段代码首先设置了 _CATKIN_SETUP_DIR 变量指向当前 catkin 工作空间的 devel 目录。如果该变量已经存在则保持不变否则使用默认路径 /home/ssmec/catkin_ws/devel。然后它定义了 _SETUP_UTIL 变量指向 devel 目录下的 _setup_util.py Python 脚本。接下来它检查 _setup_util.py 是否存在。如果不存在脚本会输出错误信息并返回状态码 22表示失败。 2. 检测操作系统 _UNAMEuname -s _IS_DARWIN0 if [ $_UNAME Darwin ]; then_IS_DARWIN1 fi unset _UNAME这段代码使用 uname -s 命令检测当前操作系统。如果操作系统是 macOSDarwin则将 _IS_DARWIN 设置为 1否则保持为 0。之后它清除了 _UNAME 变量因为它不再需要。 3. 设置环境变量 export CMAKE_PREFIX_PATH if [ $_IS_DARWIN -eq 0 ]; thenexport LD_LIBRARY_PATH elseexport DYLD_LIBRARY_PATH fi unset _IS_DARWIN export PATH export PKG_CONFIG_PATH export PYTHONPATH这段代码导出了几个关键的环境变量 CMAKE_PREFIX_PATH用于指定 CMake 应查找的安装前缀。LD_LIBRARY_PATHLinux或 DYLD_LIBRARY_PATHmacOS用于指定动态链接器应查找的库路径。PATH用于指定可执行文件的搜索路径。PKG_CONFIG_PATH用于指定 pkg-config 应查找的 .pc 文件路径。PYTHONPATH用于指定 Python 解释器应查找的模块路径。 4. 记住 shell 类型 if [ -z $CATKIN_SHELL ]; thenCATKIN_SHELLsh fi如果 CATKIN_SHELL 环境变量未设置则将其设置为 sh。这个变量用于告诉 _setup_util.py 当前使用的 shell 类型以便生成正确的 shell 语法。 5. 调用 Python 脚本生成环境变量 if [ -d ${TMPDIR:-} ]; then_TMPDIR${TMPDIR} else_TMPDIR/tmp fi _SETUP_TMPmktemp ${_TMPDIR}/setup.sh.XXXXXXXXXX unset _TMPDIR if [ $? -ne 0 -o ! -f $_SETUP_TMP ]; thenecho Could not create temporary file: $_SETUP_TMPreturn 1 fi CATKIN_SHELL$CATKIN_SHELL $_SETUP_UTIL $ ${CATKIN_SETUP_UTIL_ARGS:-} $_SETUP_TMP _RC$? if [ $_RC -ne 0 ]; thenif [ $_RC -eq 2 ]; thenecho Could not write the output of $_SETUP_UTIL to temporary file $_SETUP_TMP: may be the disk if full?elseecho Failed to run \$_SETUP_UTIL\ $: return code $_RCfiunset _RCunset _SETUP_UTILrm -f $_SETUP_TMPunset _SETUP_TMPreturn 1 fi unset _RC unset _SETUP_UTIL . $_SETUP_TMP rm -f $_SETUP_TMP unset _SETUP_TMP这段代码创建了一个临时文件 _SETUP_TMP用于存储 _setup_util.py 生成的环境变量导出命令。它调用 _setup_util.py并将生成的命令追加到临时文件中。$ 表示传递给 setup.sh 的所有命令行参数CATKIN_SETUP_UTIL_ARGS 是一个环境变量允许用户通过设置它来传递额外的参数如 --extend 或 --local。如果 _setup_util.py 执行失败脚本会输出错误信息并返回非零状态码。如果成功脚本会读取并执行临时文件中的命令从而应用生成的环境变量设置。最后它删除临时文件并清理相关变量。 6. 加载环境钩子 _i0 while [ $_i -lt $_CATKIN_ENVIRONMENT_HOOKS_COUNT ]; doeval _envfile\$_CATKIN_ENVIRONMENT_HOOKS_$_iunset _CATKIN_ENVIRONMENT_HOOKS_$_ieval _envfile_workspace\$_CATKIN_ENVIRONMENT_HOOKS_${_i}_WORKSPACEunset _CATKIN_ENVIRONMENT_HOOKS_${_i}_WORKSPACE# set workspace for environment hookCATKIN_ENV_HOOK_WORKSPACE$_envfile_workspace. $_envfileunset CATKIN_ENV_HOOK_WORKSPACE_i$((_i 1)) done unset _i这段代码遍历所有找到的环境钩子通过 _CATKIN_ENVIRONMENT_HOOKS_COUNT 变量确定数量并依次执行每个钩子。每个钩子是一个脚本文件_envfile 包含钩子的路径_envfile_workspace 包含钩子所属的工作空间路径。在执行每个钩子之前脚本会设置 CATKIN_ENV_HOOK_WORKSPACE 变量以便钩子知道它属于哪个工作空间。执行完钩子后脚本会清除相关变量继续处理下一个钩子。 7. 清理 unset _CATKIN_ENVIRONMENT_HOOKS_COUNT最后脚本会清除 _CATKIN_ENVIRONMENT_HOOKS_COUNT 变量以确保没有残留的环境变量。 总结 setup.sh 是一个非常重要的脚本它负责为当前终端会话设置正确的环境变量使得用户可以在该工作空间中使用 ROS 包和工具。它不仅设置了基本的环境变量还处理了多工作空间的依赖关系并加载了所有相关的环境钩子。通过这种方式setup.sh 确保了 ROS 环境的正确配置使得开发和运行 ROS 节点变得更加方便。 _setup_util.py #!/usr/bin/python3 # -*- coding: utf-8 -*-# Software License Agreement (BSD License) # # Copyright (c) 2012, Willow Garage, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # * Neither the name of Willow Garage, Inc. nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE.This file generates shell code for the setup.SHELL scripts to set environment variables.from __future__ import print_functionimport argparse import copy import errno import os import platform import sysCATKIN_MARKER_FILE .catkinsystem platform.system() IS_DARWIN (system Darwin) IS_WINDOWS (system Windows)PATH_TO_ADD_SUFFIX [bin] if IS_WINDOWS:# while catkin recommends putting dlls into bin, 3rd party packages often put dlls into lib# since Windows finds dlls via the PATH variable, prepend it with path to libPATH_TO_ADD_SUFFIX.extend([[lib, os.path.join(lib, aarch64-linux-gnu)]])# subfolder of workspace prepended to CMAKE_PREFIX_PATH ENV_VAR_SUBFOLDERS {CMAKE_PREFIX_PATH: ,LD_LIBRARY_PATH if not IS_DARWIN else DYLD_LIBRARY_PATH: [lib, os.path.join(lib, aarch64-linux-gnu)],PATH: PATH_TO_ADD_SUFFIX,PKG_CONFIG_PATH: [os.path.join(lib, pkgconfig), os.path.join(lib, aarch64-linux-gnu, pkgconfig)],PYTHONPATH: lib/python3/dist-packages, }def rollback_env_variables(environ, env_var_subfolders):Generate shell code to reset environment variables.by unrolling modifications based on all workspaces in CMAKE_PREFIX_PATH.This does not cover modifications performed by environment hooks.lines []unmodified_environ copy.copy(environ)for key in sorted(env_var_subfolders.keys()):subfolders env_var_subfolders[key]if not isinstance(subfolders, list):subfolders [subfolders]value _rollback_env_variable(unmodified_environ, key, subfolders)if value is not None:environ[key] valuelines.append(assignment(key, value))if lines:lines.insert(0, comment(reset environment variables by unrolling modifications based on all workspaces in CMAKE_PREFIX_PATH))return linesdef _rollback_env_variable(environ, name, subfolders):For each catkin workspace in CMAKE_PREFIX_PATH remove the first entry from env[NAME] matching workspace subfolder.:param subfolders: list of str or subfoldername that may start with /:returns: the updated value of the environment variable.value environ[name] if name in environ else env_paths [path for path in value.split(os.pathsep) if path]value_modified Falsefor subfolder in subfolders:if subfolder:if subfolder.startswith(os.path.sep) or (os.path.altsep and subfolder.startswith(os.path.altsep)):subfolder subfolder[1:]if subfolder.endswith(os.path.sep) or (os.path.altsep and subfolder.endswith(os.path.altsep)):subfolder subfolder[:-1]for ws_path in _get_workspaces(environ, include_fuerteTrue, include_non_existingTrue):path_to_find os.path.join(ws_path, subfolder) if subfolder else ws_pathpath_to_remove Nonefor env_path in env_paths:env_path_clean env_path[:-1] if env_path and env_path[-1] in [os.path.sep, os.path.altsep] else env_pathif env_path_clean path_to_find:path_to_remove env_pathbreakif path_to_remove:env_paths.remove(path_to_remove)value_modified Truenew_value os.pathsep.join(env_paths)return new_value if value_modified else Nonedef _get_workspaces(environ, include_fuerteFalse, include_non_existingFalse):Based on CMAKE_PREFIX_PATH return all catkin workspaces.:param include_fuerte: The flag if paths starting with /opt/ros/fuerte should be considered workspaces, bool# get all cmake prefix pathsenv_name CMAKE_PREFIX_PATHvalue environ[env_name] if env_name in environ else paths [path for path in value.split(os.pathsep) if path]# remove non-workspace pathsworkspaces [path for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE)) or (include_fuerte and path.startswith(/opt/ros/fuerte)) or (include_non_existing and not os.path.exists(path))]return workspacesdef prepend_env_variables(environ, env_var_subfolders, workspaces):Generate shell code to prepend environment variables for the all workspaces.lines []lines.append(comment(prepend folders of workspaces to environment variables))paths [path for path in workspaces.split(os.pathsep) if path]prefix _prefix_env_variable(environ, CMAKE_PREFIX_PATH, paths, )lines.append(prepend(environ, CMAKE_PREFIX_PATH, prefix))for key in sorted(key for key in env_var_subfolders.keys() if key ! CMAKE_PREFIX_PATH):subfolder env_var_subfolders[key]prefix _prefix_env_variable(environ, key, paths, subfolder)lines.append(prepend(environ, key, prefix))return linesdef _prefix_env_variable(environ, name, paths, subfolders):Return the prefix to prepend to the environment variable NAME.Adding any path in NEW_PATHS_STR without creating duplicate or empty items.value environ[name] if name in environ else environ_paths [path for path in value.split(os.pathsep) if path]checked_paths []for path in paths:if not isinstance(subfolders, list):subfolders [subfolders]for subfolder in subfolders:path_tmp pathif subfolder:path_tmp os.path.join(path_tmp, subfolder)# skip nonexistent pathsif not os.path.exists(path_tmp):continue# exclude any path already in env and any path we already addedif path_tmp not in environ_paths and path_tmp not in checked_paths:checked_paths.append(path_tmp)prefix_str os.pathsep.join(checked_paths)if prefix_str ! and environ_paths:prefix_str os.pathsepreturn prefix_strdef assignment(key, value):if not IS_WINDOWS:return export %s%s % (key, value)else:return set %s%s % (key, value)def comment(msg):if not IS_WINDOWS:return # %s % msgelse:return REM %s % msgdef prepend(environ, key, prefix):if key not in environ or not environ[key]:return assignment(key, prefix)if not IS_WINDOWS:return export %s%s$%s % (key, prefix, key)else:return set %s%s%%%s%% % (key, prefix, key)def find_env_hooks(environ, cmake_prefix_path):Generate shell code with found environment hooks for the all workspaces.lines []lines.append(comment(found environment hooks in workspaces))generic_env_hooks []generic_env_hooks_workspace []specific_env_hooks []specific_env_hooks_workspace []generic_env_hooks_by_filename {}specific_env_hooks_by_filename {}generic_env_hook_ext bat if IS_WINDOWS else shspecific_env_hook_ext environ[CATKIN_SHELL] if not IS_WINDOWS and CATKIN_SHELL in environ and environ[CATKIN_SHELL] else None# remove non-workspace pathsworkspaces [path for path in cmake_prefix_path.split(os.pathsep) if path and os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))]for workspace in reversed(workspaces):env_hook_dir os.path.join(workspace, etc, catkin, profile.d)if os.path.isdir(env_hook_dir):for filename in sorted(os.listdir(env_hook_dir)):if filename.endswith(.%s % generic_env_hook_ext):# remove previous env hook with same name if presentif filename in generic_env_hooks_by_filename:i generic_env_hooks.index(generic_env_hooks_by_filename[filename])generic_env_hooks.pop(i)generic_env_hooks_workspace.pop(i)# append env hookgeneric_env_hooks.append(os.path.join(env_hook_dir, filename))generic_env_hooks_workspace.append(workspace)generic_env_hooks_by_filename[filename] generic_env_hooks[-1]elif specific_env_hook_ext is not None and filename.endswith(.%s % specific_env_hook_ext):# remove previous env hook with same name if presentif filename in specific_env_hooks_by_filename:i specific_env_hooks.index(specific_env_hooks_by_filename[filename])specific_env_hooks.pop(i)specific_env_hooks_workspace.pop(i)# append env hookspecific_env_hooks.append(os.path.join(env_hook_dir, filename))specific_env_hooks_workspace.append(workspace)specific_env_hooks_by_filename[filename] specific_env_hooks[-1]env_hooks generic_env_hooks specific_env_hooksenv_hooks_workspace generic_env_hooks_workspace specific_env_hooks_workspacecount len(env_hooks)lines.append(assignment(_CATKIN_ENVIRONMENT_HOOKS_COUNT, count))for i in range(count):lines.append(assignment(_CATKIN_ENVIRONMENT_HOOKS_%d % i, env_hooks[i]))lines.append(assignment(_CATKIN_ENVIRONMENT_HOOKS_%d_WORKSPACE % i, env_hooks_workspace[i]))return linesdef _parse_arguments(argsNone):parser argparse.ArgumentParser(descriptionGenerates code blocks for the setup.SHELL script.)parser.add_argument(--extend, actionstore_true, helpSkip unsetting previous environment variables to extend context)parser.add_argument(--local, actionstore_true, helpOnly consider this prefix path and ignore other prefix path in the environment)return parser.parse_known_args(argsargs)[0]if __name__ __main__:try:try:args _parse_arguments()except Exception as e:print(e, filesys.stderr)sys.exit(1)if not args.local:# environment at generation timeCMAKE_PREFIX_PATH r/home/ssmec/catkin_ws/install;/home/ssmec/catkin_ws/devel;/opt/ros/noetic.split(;)else:# dont consider any other prefix path than this oneCMAKE_PREFIX_PATH []# prepend current workspace if not already part of CPPbase_path os.path.dirname(__file__)# CMAKE_PREFIX_PATH uses forward slash on all platforms, but __file__ is platform dependent# base_path on Windows contains backward slashes, need to be converted to forward slashes before comparisonif os.path.sep ! /:base_path base_path.replace(os.path.sep, /)if base_path not in CMAKE_PREFIX_PATH:CMAKE_PREFIX_PATH.insert(0, base_path)CMAKE_PREFIX_PATH os.pathsep.join(CMAKE_PREFIX_PATH)environ dict(os.environ)lines []if not args.extend:lines rollback_env_variables(environ, ENV_VAR_SUBFOLDERS)lines prepend_env_variables(environ, ENV_VAR_SUBFOLDERS, CMAKE_PREFIX_PATH)lines find_env_hooks(environ, CMAKE_PREFIX_PATH)print(\n.join(lines))# need to explicitly flush the outputsys.stdout.flush()except IOError as e:# and catch potential broken pipe if stdout is not writable# which can happen when piping the output to a file but the disk is fullif e.errno errno.EPIPE:print(e, filesys.stderr)sys.exit(2)raisesys.exit(0)_setup_util.py 的完整功能解析 _setup_util.py 是 ROSRobot Operating System中 catkin 工作空间的一部分它的主要职责是生成用于设置环境变量的 shell 代码。这个 Python 脚本被 setup.sh 调用以确保当前终端会话中的环境变量正确配置使得用户可以在该工作空间中使用 ROS 包和工具。 文件结构与功能 1. 全局变量和常量 CATKIN_MARKER_FILE .catkin system platform.system() IS_DARWIN (system Darwin) IS_WINDOWS (system Windows) PATH_TO_ADD_SUFFIX [bin] if IS_WINDOWS:PATH_TO_ADD_SUFFIX.extend([[lib, os.path.join(lib, aarch64-linux-gnu)]])CATKIN_MARKER_FILE定义了标记文件 .catkin用于识别 catkin 工作空间。system获取当前操作系统名称。IS_DARWIN 和 IS_WINDOWS分别标识是否为 macOS 和 Windows 系统。PATH_TO_ADD_SUFFIX定义了要添加到 PATH 环境变量的子目录默认是 bin。在 Windows 上还会添加 lib 和 lib/aarch64-linux-gnu。 2. 环境变量子目录映射 ENV_VAR_SUBFOLDERS {CMAKE_PREFIX_PATH: ,LD_LIBRARY_PATH if not IS_DARWIN else DYLD_LIBRARY_PATH: [lib, os.path.join(lib, aarch64-linux-gnu)],PATH: PATH_TO_ADD_SUFFIX,PKG_CONFIG_PATH: [os.path.join(lib, pkgconfig), os.path.join(lib, aarch64-linux-gnu, pkgconfig)],PYTHONPATH: lib/python3/dist-packages, }ENV_VAR_SUBFOLDERS定义了每个环境变量对应的子目录。例如CMAKE_PREFIX_PATH 没有子目录而 LD_LIBRARY_PATH或 macOS 上的 DYLD_LIBRARY_PATH对应 lib 和 lib/aarch64-linux-gnu 子目录。PATH 对应 binPKG_CONFIG_PATH 对应 lib/pkgconfig 和 lib/aarch64-linux-gnu/pkgconfigPYTHONPATH 对应 lib/python3/dist-packages。 3. 命令行参数解析 def _parse_arguments(argsNone):parser argparse.ArgumentParser(descriptionGenerates code blocks for the setup.SHELL script.)parser.add_argument(--extend, actionstore_true, helpSkip unsetting previous environment variables to extend context)parser.add_argument(--local, actionstore_true, helpOnly consider this prefix path and ignore other prefix path in the environment)return parser.parse_known_args(argsargs)[0]_parse_arguments解析命令行参数。支持两个选项 --extend跳过撤销之前设置的环境变量直接扩展当前环境。--local只考虑当前工作空间忽略链中的其他工作空间。 4. 主程序逻辑 if __name__ __main__:try:try:args _parse_arguments()except Exception as e:print(e, filesys.stderr)sys.exit(1)if not args.local:# environment at generation timeCMAKE_PREFIX_PATH r/home/ssmec/catkin_ws/install;/home/ssmec/catkin_ws/devel;/opt/ros/noetic.split(;)else:# dont consider any other prefix path than this oneCMAKE_PREFIX_PATH []# prepend current workspace if not already part of CPPbase_path os.path.dirname(__file__)# CMAKE_PREFIX_PATH uses forward slash on all platforms, but __file__ is platform dependent# base_path on Windows contains backward slashes, need to be converted to forward slashes before comparisonif os.path.sep ! /:base_path base_path.replace(os.path.sep, /)if base_path not in CMAKE_PREFIX_PATH:CMAKE_PREFIX_PATH.insert(0, base_path)CMAKE_PREFIX_PATH os.pathsep.join(CMAKE_PREFIX_PATH)environ dict(os.environ)lines []if not args.extend:lines rollback_env_variables(environ, ENV_VAR_SUBFOLDERS)lines prepend_env_variables(environ, ENV_VAR_SUBFOLDERS, CMAKE_PREFIX_PATH)lines find_env_hooks(environ, CMAKE_PREFIX_PATH)print(\n.join(lines))# need to explicitly flush the outputsys.stdout.flush()except IOError as e:# and catch potential broken pipe if stdout is not writable# which can happen when piping the output to a file but the disk is fullif e.errno errno.EPIPE:print(e, filesys.stderr)sys.exit(2)raisesys.exit(0)主程序的主要步骤 解析命令行参数 使用 _parse_arguments 函数解析命令行参数获取 --extend 和 --local 选项。 确定 CMAKE_PREFIX_PATH 如果没有指定 --local 选项则 CMAKE_PREFIX_PATH 包含当前工作空间的 install 和 devel 目录以及系统安装的 ROS 版本路径如 /opt/ros/noetic。如果指定了 --local 选项则 CMAKE_PREFIX_PATH 只包含当前工作空间的路径忽略其他工作空间。 处理当前工作空间路径 获取当前脚本所在的目录即当前工作空间的路径并将其转换为使用正斜杠/以便与 CMAKE_PREFIX_PATH 中的路径格式一致。如果当前工作空间路径不在 CMAKE_PREFIX_PATH 中则将其插入到 CMAKE_PREFIX_PATH 的首位。 生成环境变量设置代码 撤销之前的环境变量修改如果未指定 --extend 选项则调用 rollback_env_variables 函数撤销之前可能已经设置的环境变量修改。前置当前工作空间的路径调用 prepend_env_variables 函数将当前工作空间的路径前置到各个环境变量中如 CMAKE_PREFIX_PATH、LD_LIBRARY_PATH、PATH 等。查找并加载环境钩子调用 find_env_hooks 函数查找并加载所有找到的环境钩子environment hooks这些钩子可以进一步修改环境变量或其他配置。 输出生成的 shell 代码 将生成的所有 shell 代码行连接成一个字符串并打印到标准输出。显式刷新标准输出确保所有内容都被写入。 异常处理 捕获潜在的 I/O 错误特别是当标准输出不可写时例如磁盘已满的情况并返回相应的错误码。 退出程序 正常情况下程序以状态码 0 退出表示成功执行。 关键函数解析 1. rollback_env_variables def rollback_env_variables(environ, env_var_subfolders):Generate shell code to reset environment variables.by unrolling modifications based on all workspaces in CMAKE_PREFIX_PATH.This does not cover modifications performed by environment hooks.lines []unmodified_environ copy.copy(environ)for key in sorted(env_var_subfolders.keys()):subfolders env_var_subfolders[key]if not isinstance(subfolders, list):subfolders [subfolders]value _rollback_env_variable(unmodified_environ, key, subfolders)if value is not None:environ[key] valuelines.append(assignment(key, value))if lines:lines.insert(0, comment(reset environment variables by unrolling modifications based on all workspaces in CMAKE_PREFIX_PATH))return lines功能生成用于重置环境变量的 shell 代码撤销基于 CMAKE_PREFIX_PATH 中所有工作空间的修改。逻辑遍历 env_var_subfolders 中定义的环境变量调用 _rollback_env_variable 函数移除与每个工作空间相关的路径然后生成相应的 shell 代码。 2. _rollback_env_variable def _rollback_env_variable(environ, name, subfolders):For each catkin workspace in CMAKE_PREFIX_PATH remove the first entry from env[NAME] matching workspace subfolder.:param subfolders: list of str or subfoldername that may start with /:returns: the updated value of the environment variable.value environ[name] if name in environ else env_paths [path for path in value.split(os.pathsep) if path]value_modified Falsefor subfolder in subfolders:if subfolder:if subfolder.startswith(os.path.sep) or (os.path.altsep and subfolder.startswith(os.path.altsep)):subfolder subfolder[1:]if subfolder.endswith(os.path.sep) or (os.path.altsep and subfolder.endswith(os.path.altsep)):subfolder subfolder[:-1]for ws_path in _get_workspaces(environ, include_fuerteTrue, include_non_existingTrue):path_to_find os.path.join(ws_path, subfolder) if subfolder else ws_pathpath_to_remove Nonefor env_path in env_paths:env_path_clean env_path[:-1] if env_path and env_path[-1] in [os.path.sep, os.path.altsep] else env_pathif env_path_clean path_to_find:path_to_remove env_pathbreakif path_to_remove:env_paths.remove(path_to_remove)value_modified Truenew_value os.pathsep.join(env_paths)return new_value if value_modified else None功能从环境变量中移除与每个 catkin 工作空间相关的路径。逻辑遍历 CMAKE_PREFIX_PATH 中的工作空间路径检查环境变量中是否有与工作空间子目录匹配的路径如果有则移除该路径并返回更新后的环境变量值。 3. _get_workspaces def _get_workspaces(environ, include_fuerteFalse, include_non_existingFalse):Based on CMAKE_PREFIX_PATH return all catkin workspaces.:param include_fuerte: The flag if paths starting with /opt/ros/fuerte should be considered workspaces, bool# get all cmake prefix pathsenv_name CMAKE_PREFIX_PATHvalue environ[env_name] if env_name in environ else paths [path for path in value.split(os.pathsep) if path]# remove non-workspace pathsworkspaces [path for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE)) or (include_fuerte and path.startswith(/opt/ros/fuerte)) or (include_non_existing and not os.path.exists(path))]return workspaces功能根据 CMAKE_PREFIX_PATH 返回所有 catkin 工作空间的路径。逻辑遍历 CMAKE_PREFIX_PATH 中的路径检查每个路径是否包含 .catkin 标记文件或者是否符合特定条件如 /opt/ros/fuerte并返回符合条件的工作空间路径。 4. prepend_env_variables def prepend_env_variables(environ, env_var_subfolders, workspaces):Generate shell code to prepend environment variables for the all workspaces.lines []lines.append(comment(prepend folders of workspaces to environment variables))paths [path for path in workspaces.split(os.pathsep) if path]prefix _prefix_env_variable(environ, CMAKE_PREFIX_PATH, paths, )lines.append(prepend(environ, CMAKE_PREFIX_PATH, prefix))for key in sorted(key for key in env_var_subfolders.keys() if key ! CMAKE_PREFIX_PATH):subfolder env_var_subfolders[key]prefix _prefix_env_variable(environ, key, paths, subfolder)lines.append(prepend(environ, key, prefix))return lines功能生成用于前置环境变量的 shell 代码将当前工作空间的路径添加到各个环境变量中。逻辑遍历 env_var_subfolders 中定义的环境变量调用 _prefix_env_variable 函数生成前置路径然后生成相应的 shell 代码。 5. _prefix_env_variable def _prefix_env_variable(environ, name, paths, subfolders):Return the prefix to prepend to the environment variable NAME.Adding any path in NEW_PATHS_STR without creating duplicate or empty items.value environ[name] if name in environ else environ_paths [path for path in value.split(os.pathsep) if path]checked_paths []for path in paths:if not isinstance(subfolders, list):subfolders [subfolders]for subfolder in subfolders:path_tmp pathif subfolder:path_tmp os.path.join(path_tmp, subfolder)# skip nonexistent pathsif not os.path.exists(path_tmp):continue# exclude any path already in env and any path we already addedif path_tmp not in environ_paths and path_tmp not in checked_paths:checked_paths.append(path_tmp)prefix_str os.pathsep.join(checked_paths)if prefix_str ! and environ_paths:prefix_str os.pathsepreturn prefix_str功能生成要前置到环境变量的路径字符串确保不会添加重复或无效的路径。逻辑遍历 paths 中的路径检查每个路径是否存在并确保不会添加已经存在于环境变量中的路径最后返回前置路径字符串。 6. find_env_hooks def find_env_hooks(environ, cmake_prefix_path):Generate shell code with found environment hooks for the all workspaces.lines []lines.append(comment(found environment hooks in workspaces))generic_env_hooks []generic_env_hooks_workspace []specific_env_hooks []specific_env_hooks_workspace []generic_env_hooks_by_filename {}specific_env_hooks_by_filename {}generic_env_hook_ext bat if IS_WINDOWS else shspecific_env_hook_ext environ[CATKIN_SHELL] if not IS_WINDOWS and CATKIN_SHELL in environ and environ[CATKIN_SHELL] else Noneworkspaces [path for path in cmake_prefix_path.split(os.pathsep) if path and os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))]for workspace in reversed(workspaces):env_hook_dir os.path.join(workspace, etc, catkin, profile.d)if os.path.isdir(env_hook_dir):for filename in sorted(os.listdir(env_hook_dir)):if filename.endswith(.%s % generic_env_hook_ext):# remove previous env hook with same name if presentif filename in generic_env_hooks_by_filename:i generic_env_hooks.index(generic_env_hooks_by_filename[filename])generic_env_hooks.pop(i)generic_env_hooks_workspace.pop(i)# append env hookgeneric_env_hooks.append(os.path.join(env_hook_dir, filename))generic_env_hooks_workspace.append(workspace)generic_env_hooks_by_filename[filename] generic_env_hooks[-1]elif specific_env_hook_ext is not None and filename.endswith(.%s % specific_env_hook_ext):# remove previous env hook with same name if presentif filename in specific_env_hooks_by_filename:i specific_env_hooks.index(specific_env_hooks_by_filename[filename])specific_env_hooks.pop(i)specific_env_hooks_workspace.pop(i)# append env hookspecific_env_hooks.append(os.path.join(env_hook_dir, filename))specific_env_hooks_workspace.append(workspace)specific_env_hooks_by_filename[filename] specific_env_hooks[-1]env_hooks generic_env_hooks specific_env_hooksenv_hooks_workspace generic_env_hooks_workspace specific_env_hooks_workspacecount len(env_hooks)lines.append(assignment(_CATKIN_ENVIRONMENT_HOOKS_COUNT, count))for i in range(count):lines.append(assignment(_CATKIN_ENVIRONMENT_HOOKS_%d % i, env_hooks[i]))lines.append(assignment(_CATKIN_ENVIRONMENT_HOOKS_%d_WORKSPACE % i, env_hooks_workspace[i]))return lines功能查找并加载所有找到的环境钩子environment hooks生成相应的 shell 代码。逻辑遍历 CMAKE_PREFIX_PATH 中的工作空间查找 etc/catkin/profile.d 目录下的环境钩子文件如 .sh 或 .bat并生成用于加载这些钩子的 shell 代码。确保不会加载重复的钩子文件并且优先加载当前工作空间的钩子。 总结 _setup_util.py 的主要作用是生成用于设置环境变量的 shell 代码确保当前终端会话中的环境变量正确配置使得用户可以在 catkin 工作空间中使用 ROS 包和工具。它通过以下步骤实现这一目标 解析命令行参数决定是否扩展或覆盖已有的环境变量。确定 CMAKE_PREFIX_PATH根据 --local 选项决定是否只考虑当前工作空间。处理当前工作空间路径确保当前工作空间的路径被正确添加到 CMAKE_PREFIX_PATH 中。生成环境变量设置代码撤销之前的环境变量修改前置当前工作空间的路径并查找并加载环境钩子。输出生成的 shell 代码将生成的 shell 代码打印到标准输出供 setup.sh 等脚本使用。 通过这种方式_setup_util.py 确保了 ROS 环境的正确配置使得开发和运行 ROS 节点变得更加方便。
http://www.w-s-a.com/news/431550/

相关文章:

  • 国内优秀设计网站站长哈尔滨微网站建设
  • 如何建设一个优秀的电商网站沐风seo
  • 从零开始学网站建设知乎安防网站下载
  • 打开网站弹出qq应用软件有哪些
  • 温州网站建设seo网站 如何做 中英文切换
  • 聊城做网站的公司资讯信阳 网站建设
  • 天津市工程建设交易网站查汗国珠海 网页设计
  • 龙果学院大型网站稳定性建设汾阳做网站
  • 湖北 个人网站备案时间域名查询备案查询
  • 网站推广方式校园网站怎么建
  • 长沙seo网站排名怎么在百度发帖
  • 织梦贷款网站模板做印章网站
  • 彭州做网站上海百度网络推广
  • 广州网站搭建快速提升网站排名荧光字网站
  • 15年做那些网站能致富做seo是什么意思
  • 各电商网站的特点网站制作2007
  • 用html做一号店网站怎么做公众号注册平台官网
  • 做盈利网站怎么备案vs做网站如何调试
  • 嘉兴做营销型网站廊坊做网站外包
  • 双语网站模板常州做网站的公司
  • 广州市车管所网站建设全国做网站公司前十名
  • 太原手手工网站建设公司视频直播服务
  • 雷达图 做图网站wordpress首页怎么美化
  • 四川做网站设计公司价格vip解析网站怎么做的
  • 网站建设流程域名申请做化工的 有那些网站
  • 软件开发设计流程图seo搜索引擎官网
  • 外国小孩和大人做网站东富龙科技股份有限公司
  • 上线倒计时单页网站模板做网站的资金来源
  • 泸州市建设厅网站中小企业网络需求分析
  • asp网站版权做网页价格