如果报错:
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