sudo rosdep init出错的解决方案

如果报错:

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:

https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

Website may be down.

解决方案:

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

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

env | grep proxy

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

尝试看用火狐和谷歌浏览器访问https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

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

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

wget https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

如果返回

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 https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

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

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(‘https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list‘, verify=False)

print(page1.content.decode())

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

context = ssl._create_unverified_context()

f = urlopen(‘https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list‘, 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

    原文作者:Z-HE
    原文地址: https://zhuanlan.zhihu.com/p/43345574
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞