系统环境
Ubuntu18.04
vscode 版本:1.51.1
使用的python插件:Python,Python Extenson Pack
虚拟环境: 用anaconda3创建了名为 pytorch16的虚拟环境。该环境里用命令
pip install opencv-python
安装的 opencv。
遇到问题
使用过程中可以正常 import cv2,调用cv2的函数时有2个问题:
1) pylint提示 “Module 'cv2' has no *** member”
2) 输入 cv2.imwrite() 等常规函数时没有自动补全提示
解决方案
1) "ctrl+T"打开终端进入项目文件夹 :
cd ./Desktop/image_transform #(vscode 必须打开一整个文件夹才能执行文件)
2) 在当前路径下激活虚拟环境 :
conda activate pytorch16
3) 在当前路径下通过命令打开vscode, : (这一步解决了cv2不能自动补全的问题)
code ./ & #(&意思是后台运行,这样把终端关掉也不会影响已经打开的vscode)
再在左下角的状态栏里选择当前名为pytorch16的虚拟环境:
现在可以解决没有自动补全的问题了,但cv2上还是有红色波浪线,这是pylint的问题。
4)现在设置pylint,让pylint能够检测到cv2的包。在vscode界面打开首选项的json文件: "ctrl+shift+p",输入“>Preferences: Open Settings (json)”
5) 在json文件中添加如下命令: (这一步解决了pylint提示 “Module 'cv2' has no *** member”的问题)
"python.linting.pylintArgs": [
"--extension-pkg-whitelist=cv2"
]
然后ctrl+s保存一下。
进行完以上设置之后,每次都要从终端先激活虚拟环境,再打开项目文件夹 就没有红色波浪线了,cv2也能自动补全。
问题原理
Python 这个插件是利用pylint进行语法检查,jedi进行代码自动补全的。
首先,opencv的函数本身是用C语言写的,cv2只是一个opencv提供给python的函数接口,所以cv2里面的函数pylint是检测不到的。因此,要让Python这个插件每次调用 pylint的时候加上 --extension-pkg-whitelist=cv2 这个参数来告诉pylint检测cv2这个库中用C语言写的包。
# 以下摘自pylint的help文档
--extension-pkg-whitelist=<pkg[,pkg]>
A comma-separated list of package or module names from
where C extensions may be loaded. Extensions are
loading into the active Python interpreter and may run
arbitrary code. [current: none]
其次,jedi本身在创建虚拟环境的时候conda就给装好了,每个虚拟环境下都会有一个jedi(包括conda的base环境本身)。如果不从终端打开,直接从图标打开,那么vscode会默认使用conda 的base环境中的jedi,这时候如果状态栏再选择pytorch16虚拟环境的话,就没有自动补全提示了。
辟谣
对于pylint不能检测到cv2导致的红色波浪线的问题,网上有一些教程提到直接加--generate-members这个参数,这是不对的。因为pylint根本没有这个选项。加上这个参数之后pylint会失效(pylint出错,vscode是不会报任何信息的),从而造成没错误的“假象”。