zoukankan      html  css  js  c++  java
  • https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

    ERROR: cannot download default sources list from:
    https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
    Website may be down.

    解决方法:我使用的最后一个,可以

    Traceback (most recent call last): File "/usr/bin/rosdep", line 3, in <module> from rosdep2.main import rosdep_main ImportError: No module named 'rosdep2'

    解决方案:将Ubuntu默认python版本设置为2.7。

    如果报错:

    ERROR: cannot download default sources list from:

    Website may be down.

    解决方案:

    1)先尝试sudo -E rosdep init。不行则再看下一步。

    2)先看看是网络不通(代理服务器没有设置正确)

    env | grep proxy

    看看HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy这些设置的是否OK。

    尝试看用火狐和谷歌浏览器访问

    如果不能访问,则说明网络不通。先把网络调通。网络调通后还不行,再看下一步。

    3)用wget测试一下,看是否是证书不对

    wget

    如果返回

    ERROR: cannot verify Build software better, together's certificate, issued by ‘.......’:

    Unable to locally verify the issuer's authority.

    To connect to Build software better, together insecurely, use `--no-check-certificate'.

    则说明证书不对。此时,按上述提示,增加--no-check-certificate,试试

    wget --no-check-certificate

    如果这时就正确的获得了这个文件,就说明确实是证书不对。

    4)尝试解决证书问题

    sudo apt-get install ca-certificates

    sudo c_rehash /etc/ssl/certs

    如果还是解决不了,就麻烦了,必须用下面巨麻烦的办法,绕过证书。

    5)下面是一个python3的小程序,试试是否可以绕过证书

    import requests

    import requests_ntlm

    from urllib.request import urlopen

    from urllib.error import URLError

    import ssl

    #方法一:session访问http的例子

    session = requests.session()

    session.auth = requests_ntlm.HttpNtlmAuth(r'你的域你的用户名','你的密码', session)

    session.proxies = { "http": "你的http代理(不包括用户名密码)", "https": "你的https代理(不包括用户名密码)", }

    page = session.get('百度一下,你就知道')

    print(page.content.decode())

     

    #方法一:session访问https,绕过证书的例子,关键一句是verify=False

    session1 = requests.session()

    session1.proxies = { "http": "你的http代理(包括用户名密码)", "https": "你的https代理(包括用户名密码)" }

    page1 = session1.get('', verify=False)

    print(page1.content.decode())

     

    #方法三:urlopen访问https,绕过证书的例子

    context = ssl._create_unverified_context()

    f = urlopen('', timeout=10.0, context = context)

    print(f.read())

    如果测试通过,3种方法都获得了结果,就说明绕过的策略可行,接下来就是巨巨麻烦的实作绕过了。

    6)绕过证书

    1> 找到rosdep

    因为sudo -E rosdep init失败,所以我们用whereis rosdep,看看rosdeop是个什么,得到:

    rosde: /usr/bin/rosdep

    它就是一个python2的程序。所以,我们的策略很明确,就是修改rosdep的源代码,把所有访问url的地方,都改成绕过证书。

    2> 找到rosdep2

    首先,从rosdep的内容,可以看到

    from rosdep2.main import rosdep_main

    所以,我们要找rosdep2在哪里。通过查看sys.path,方法是写一个b.py,内容只有2行

    import sys

    print sys.path

    然后用python2 b.py来运行,看到所有的python2的路径。

    其中有2个可疑的:

    '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python2.7'

    分别去找,第一个里面没找到,第二个里面找到了,位置在:

    /usr/lib/python2.7/dist-packages/rosdep2

    里面也确实有一个main.py,里面确实也有一个函数rosdep_main

    3> 顺藤摸瓜,找到访问url的代码

    在main.py中,从rosdep_main()开始,追踪到command_init(),再追踪到download_default_sources_list(),通过在这句前后增加print()语句定位到是这句出错。

    download_default_sources_list()是from .sources_list import的,所以打开sources_list.py,定位到download_default_sources_list(),

    在这里,使用了urlopen(),它就是罪魁祸首。

    4> 修改它

    urlopen()的前面增加一句 context = ssl._create_unverified_context()

    urlopen()增加一个参数:context = context

    代码就变成了:

    context = ssl._create_unverified_context() #add

    try:

    f = urlopen(url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified

    5> 重新运行 sudo -E rosdep init

    这个报错就过了,但还会再报其他的错,按照上面的方法,顺藤摸瓜,把所有urlopen()都改掉。

    6> 当sudo -E rosdep init通过后,运行rosdep update

    还会报错,按照上面的方法,顺藤摸瓜,把所有urlopen()都改掉。

    注意,其中还有import rosdistro,而rosdistro在/usr/lib/python2.7/dist-packages/下,追踪时,要看它的__init__.py。

    最后就成功了。

    7> 最后统计一下,改了如下地方:

    ./rosdep2/gbpdistro_support.py:import ssl #add by me

    ./rosdep2/gbpdistro_support.py: context = ssl._create_unverified_context() #add by me

    ./rosdep2/gbpdistro_support.py: f = urlopen(gbpdistro_url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

    ./rosdep2/sources_list.py:import ssl #add by me

    ./rosdep2/sources_list.py: context = ssl._create_unverified_context() #add by me

    ./rosdep2/sources_list.py: f = urlopen(url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

    ./rosdep2/sources_list.py: context = ssl._create_unverified_context() #add by me

    ./rosdep2/sources_list.py: f = urlopen(url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

    ./rosdep2/rep3.py:import ssl #add by me

    ./rosdep2/rep3.py: context = ssl._create_unverified_context() #add by me

    ./rosdep2/rep3.py: f = urlopen(targets_url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

    ./rosdistro/loader.py:import ssl #add by me

    ./rosdistro/loader.py: context = ssl._create_unverified_context() #add by me

    ./rosdistro/loader.py: fh = urlopen(url, timeout=timeout, context = context) #modified by me

    如果还不行,则使用下面

    0. 研究背景

    由于本机是Debian 10.3,所以采用源码安装方式安装ROS。

    melodic/Installation/Source - ROS Wiki​wiki.ros.org

    根据官方指引,在进行到“1.2 初始化rosdep“时,执行rosdep init时会提示Website may be down的错误。

    报错部分代码在/usr/lib/python2.7/dist-packages/rosdep2/main.py中,原因是download_default_sources_list()无法访问网站。

    rosedep update时也要联网,默认的网站还是raw.githubusercontent.com,所以也会报错。

    1. 国内研究现状

    国内某知名搜索引擎排行前列的几种解决方案(已排除广告):

    解决思路是从网络层面入手,用科学(科-学-上-网)或玄学(手机热点)的方式,如 果出现认证错误的问题,再通过安装依赖包修改rosdep源码的方式解决。

    2. 研究思路

    raw.githubusercontent.com实际上就是github的用户数据服务器,rosdep程序下载的就是github.com/ros/rosdistro这个repo里的yaml文件

    虽然raw.githubusercontent.com服务器无法访问,但是yaml文件可以直接从git clone的repo中获得。

    所以,只要将ros/rosdistro整个git下来,然后再将

    • 20-default.list
    • /usr/lib/python2.7/dist-packages/rosdep2/main.py
    • /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
    • /usr/lib/python2.7/dist-packages/rosdistro/__init__.py

    中的默认url全部指向本地的git,即可解决这个问题。

    3. 解决步骤

    1. git clone https://github.com/ros/rosdistro.git
    2. 在本地rosdistro中搜索20-default.list,将其url指向本地repo;
    3. 搜索rosdep2rosdistro中出现的位置,将其指向本地repo。

    效果如图所示:

    转载自https://zhuanlan.zhihu.com/p/107218921

  • 相关阅读:
    MySQL之IDE工具介绍及数据备份(数据库导入,导出)
    jmeter test Fragment
    python创建虚拟环境
    遇到的问题
    文件操作
    六、迭代器与生成器
    五、IO编程
    简单的例子
    四、函数
    三、集合与格式化
  • 原文地址:https://www.cnblogs.com/gary-guo/p/12650552.html
Copyright © 2011-2022 走看看