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:
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
如果還不行,則使用下面
0. 研究背景
由於本機是Debian 10.3,所以采用源碼安裝方式安裝ROS。
melodic/Installation/Source - ROS Wiki
根據官方指引,在進行到“1.2 初始化rosdep“時,執行rosdep init時會提示Website may be down的錯誤。
報錯部分代碼在/usr/lib/python2.7/dist-packages/rosdep2/main.py中,原因是download_default_sources_list()無法訪問http://raw.githubusercontent.com網站。
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. 解決步驟
git clone https://github.com/ros/rosdistro.git;- 在本地
rosdistro中搜索20-default.list,將其url指向本地repo; - 搜索
rosdep2和rosdistro中出現http://raw.githubusercontent.com的位置,將其指向本地repo。
效果如圖所示:

轉載自https://zhuanlan.zhihu.com/p/107218921
