最近用pycharm开发完了一些项目部署到树莓派上做测试的时候跑不起来,发现报错找不到自定义模块,记录下解决办法;
环境:
linux Debian
python3.7
由于我的树莓派上没有删除python2.7,是3.7和2.7共存的,启动python3.7我的命令是python3,只有一个版本的python环境就不用带指定版本号之类的了。
原理:
python启动会自动扫描sys.path路径下相关文件,文件夹中带有__init__.py的文件夹会被python认为是包,由于只会扫描指定路径下的文件夹,所以在其他地方存放的包,python不会认为他是有效的包,所以在import的时候会导入失败报错找不到模块
使用自定义模块方法有两种:
1、直接在sys.path路径中添加自定义包路径
2、新建一个pth结尾的文件,把自定义包的路径放入到这个文件中,而这个文件也是需要放到系统指定的路径下
其实两种方法原理都是在python自动扫描的路径下添加自定义包的路径让python能扫描到,只是实现方式不一样而已
具体操作
第一种:
1、启动python,例:python3
2、查看系统扫描路径:
import sys
sys.path
3、以上操作可以看到系统自动扫描的路径,在这里添加自己的路径,例:
我的包名是getinfo,路径是/app/uswgi/getinfo, 这里的getinfo文件夹不能直接放入,需要放入的路径是/app/uwsgi/,然后 python会自动扫到该路径下的自定义包
添加方式:sys.path.append('/app/uwsgi/')
移除方式:sys.path.remove('/app/uwsgi/')
第二种:
在site-packages路径下新建带有自定义包路径的.pth文件
site-packages文件夹是python安装的时候创建的文件夹,python会自动扫描该文件夹下的内容
步骤:
1、找到site-packages文件夹:
python3
from distutils.sysconfig import get_python_lib
print(get_python_lib())
显示结果:/usr/lib/python3/dist-packages
其实该路径在第一种方式sys.path的时候就有记录,例如我的:
sys.path
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages', '/app/uswgi/']
所以site-packages文件夹在我这树莓派上是叫做dist-packages,在该路径下新建带有自定义包路径的pth文件即可
对比:
其实两种方法都是一样的,第一种添加速度快,不需要找各种文件夹路径,第二种方便后期扩展,可以在文件内写入多个地址,看个人选择