一、报错如下
二、错误原因分析
报错很明显,是因为执行的这个setup.py文件中,第35行import distro的时候,找不到模块distro。
正常来讲,Python代码中,通过import导入的,要么是Python第三方库,要么是自己开发过程中编写的一个py文件,在这里因为用到所以需要将其import,但是观察setup.py所在文件目录内,并没有名为distro.py的文件,因此可以判断要么是缺少了Carla项目中的这个文件,要么就是我们系统中缺少了distro这个Python的第三方库,想要进一步确认,我们就要知道这两行代码有什么作用,通过上图倒数第二行代码的if判断语句,可以猜测变量linux_distro是返回了系统版本。
通过查阅资料发现Python中的platform模块也可以实现该功能,开启终端,进入Python测试一下结果如下:
可以看到,通过Python的platform模块进行替换后可以完美实现原来两行代码的需求。
另外,在找到的资料里顺便看到了,distro的确是一个第三方库,所以更简单的解决方案应该是直接安装distro库,但是我直接使用了pip install distro
,安装后并没有效果,错误依旧存在,然后打开终端重新测试了一下:
这样就知道为什么不管用了,我的ubuntu18.04有两个Python版本,Python2能导入该模块,但是Python3无法使用,所以可以肯定的是,Carla项目中PythonAPI默认使用的是Python3来完成编译的,那么就需要pip3 install distro
安装才行(pip是针对Python2的,pip3是针对Python3的)。
这样问题就解决了,重新编译PythonAPI就不会报错找不到distro模块了。
三、总结:
解决方案1:添加distro库
直接在命令行输入:
pip install distro #Python2
pip3 install distro #Python3
如果安装不成功,使用方案2。
解决方案2:修改源码
在git clone下来的carla文件夹下,找到报错的setup.py代码文件并通过文本编辑器修改:
sudo gedit PythonAPI/carla/setup.py
通过文本编辑器右下角显示的当前光标所在行,找到出错的第35行,将原来的下面这两行注释掉(注释掉是因为毕竟在改别人源代码,保留原来的以防万一)
import distro
linux_distro = distro.linux_distribution()[0]
然后在他们中间加入以下两行:
import platform
linux_distro = platform.linux_distribution()[0]
修改后该代码段如图所示:
保存并退出,重新执行make PythonAPI,编译成功,该问题解决。
搞了半天,其实就是编译过程中用到的Python缺少第三方库导致编译出错,那么其他类似找不到模块的编译错误一个道理,试着重新安装库直到啥也不缺为止。