鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    catkin_install_python里面不添加Python文件名,rosrun也能运行

    已定时 已固定 已锁定 已移动 未解决
    综合问题
    noetic python cannot import
    2
    4
    367
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Q
      qitao
      最后由 编辑

      catkin_install_python(PROGRAMS

      scripts/my_python_script

      DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}

      )

      我用的ubuntu20 ros-noetic按照学习的内容,这里“my_python_script”要替换成自己的Python文件名,但是我在编译的时候没有这三行注释掉rosrun pkg a.py依然能够运行。
      另外,我的scripts文件夹下面有多个Python文件,例如a.py b.py ,
      如果我按照格式这样添加进去这两个文件,
      catkin_install_python(PROGRAMS
      scripts/a.py
      scripts/b.py
      DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
      )
      在b.py中 from a import xxx 反而会报错 cannot from a import xxx
      需要在b.py和a.py中加入下面两行代码才可以不报错
      import sys
      sys.path.insert(0, /pkg_path/scripts)

      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        在ROS(Robot Operating System)中使用catkin_install_python宏时,通常用于安装Python脚本到ROS包的bin目录下,以便可以通过rosrun命令直接运行。然而,你的描述中涉及到几个关键点需要澄清和解决。

        1. catkin_install_python 不添加文件名后缀

        在catkin_install_python宏中,你通常不需要(也不应该)包含.py文件扩展名。这是因为ROS和catkin在处理这些脚本时会自动处理它们,将它们视为可执行程序。你的用法是正确的,即:

        catkin_install_python(PROGRAMS
          scripts/my_python_script
          DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
        )
        

        这里,my_python_script是脚本的名字(不包含.py),它应该是一个可执行的Python脚本(通常第一行是#!/usr/bin/env python或#!/usr/bin/env python3来指定解释器)。

        2. 跨文件导入问题

        当你在ROS包中有多个Python脚本,并且这些脚本需要相互导入时,可能会遇到导入路径问题。这是因为ROS在运行时不会自动将你的脚本目录添加到Python的搜索路径中。这就是为什么你需要在脚本中添加sys.path.insert来手动添加脚本目录到搜索路径。

        一个更好的解决方案是使用ROS的Python模块路径管理功能。你可以将你的Python代码组织成包(package),并在__init__.py文件中进行适当的设置,这样ROS和其他Python脚本就可以通过标准的包导入机制来导入你的模块了。

        3. 组织你的Python代码为ROS包

        假设你的ROS包名为my_package,你可以这样组织你的Python代码:

        • my_package/
          • __init__.py (这是一个空文件,用于标记目录为Python包)
          • scripts/
            • __init__.py (同样,这是一个空文件)
            • a.py
            • b.py

        在a.py和b.py中,你可以直接使用from .a import xxx(注意,这需要在包内部使用,且.表示当前包)或from my_package.scripts import a(更标准的包导入方式,但通常不推荐在scripts目录下直接导入,因为scripts通常用于可执行脚本)。

        然而,由于scripts目录通常用于存放可执行脚本,你可能希望将这些Python文件放在src/my_package/下的某个目录中,而不是直接在scripts下。这样,你就可以像使用任何其他Python包一样使用它们了。

        结论

        对于你的具体问题,如果你只是想通过rosrun运行脚本,并且这些脚本需要相互导入,你可能需要继续使用sys.path.insert,或者重新考虑你的代码组织方式,以利用ROS和Python的包管理特性。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        Q 1 条回复 最后回复 回复 引用 0
        • Q
          qitao @小伊
          最后由 编辑

          @小伊 在 catkin_install_python里面不添加Python文件名,rosrun也能运行 中说:

          catkin_install_python(PROGRAMS
          scripts/my_python_script
          DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
          )

          1、我不加这三行rosrun也能运行
          catkin_install_python(PROGRAMS
          scripts/my_python_script
          DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
          )

          2、init.py的方法我尝试过,并没有生效

          1 条回复 最后回复 回复 引用 0
          • 小伊小
            机器人小伊
            最后由 编辑

            在ROS(Robot Operating System)中,catkin_install_python 宏通常用于安装Python脚本,使其可以通过ROS的rosrun命令来运行。然而,你提到即使不添加 catkin_install_python 宏,你的Python脚本也能通过 rosrun 运行,以及尝试使用 __init__.py 文件但没有生效的情况,这里有几个可能的原因和解决方案:

            1. 不加 catkin_install_python 也能运行的原因

            1. 脚本可能已经在环境变量中:如果你的Python脚本位于ROS包的一个目录中,并且该目录已经被添加到了系统的PYTHONPATH环境变量中,那么Python解释器可以直接找到并运行这个脚本,而不需要通过rosrun。但是,这通常不是ROS推荐的做法,因为rosrun提供了更多的ROS环境集成(如ROS服务、节点名称空间等)。

            2. 脚本被直接放在了可执行路径中:如果脚本的完整路径被添加到了系统的PATH环境变量中,或者脚本本身具有执行权限(通过chmod +x设置),那么你可以直接在终端中通过脚本名来运行它,而不需要rosrun。

            3. ROS包结构问题:ROS包通常有一个scripts目录,用于存放可执行脚本。如果ROS包的结构正确,并且脚本位于scripts目录下,即使没有显式使用catkin_install_python,ROS的setup.py或CMakeLists.txt中的其他设置也可能间接地使得脚本可以通过rosrun运行。

            2. __init__.py 方法没有生效

            在Python中,__init__.py 文件用于标记一个目录为Python包。然而,在ROS的上下文中,__init__.py 文件通常不是必需的,除非你打算将你的Python脚本组织成模块或包的形式。对于简单的脚本,你只需要确保它们位于ROS包的scripts目录下,并且具有执行权限。

            如果你的目的是让ROS能够识别并运行你的Python脚本,你应该:

            • 确保脚本位于ROS包的scripts目录下。
            • 确保脚本具有执行权限(使用chmod +x scripts/my_python_script)。
            • 使用catkin_install_python宏(或相应的CMake命令)来安装脚本,以便它们可以通过rosrun运行。

            结论

            如果你希望你的Python脚本能够通过rosrun运行,并且遵循ROS的最佳实践,你应该使用catkin_install_python宏(或CMake的相应命令)来安装你的脚本。这有助于确保脚本在ROS环境中正确集成,并且可以充分利用ROS提供的各种功能。如果你发现即使不这样做也能运行脚本,那么可能是你的ROS环境配置或包结构有些特殊,但这并不一定是推荐的做法。


            以上为生成回答,仅供参考~

            我是小伊,已接入ChatGpt,所有回复,仅供参考~

            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS