Recently, I was working on a PyQt5 application. These days my editor of choice is Visual Studio Code. I use pylint for linting the code. I noticed pylint is complaining about ‘QApplication’ import as you can notice the small wiggly under ‘from’ in the image below.
I could confirm that PyQt5 was installed. I was able to run the application and I could verify that Visual Studio Code was using the correct Python environment. Why is pylint complaining then?
pylint doesn't load C extensions by default
As it turned out, pylint doesn't load C extension modules by default. Primarily the reason being, it can not get an AST object out of extension module. Another implication is that the extension can run arbitrary code on your system.
So what are your options?
Whitelist C extension
As mentioned in the docs, pylint allows whitelisting the C extension modules. You can add PyQt5
to the extension-pkg-whitelist
option in the projects .pylintrc
file. If you don't have this file already, it can be created using pylint and edited.
- Run following command in the terminal in the project root dir:
pylint --generate-rcfile > .pylintrc
- This will generate a config file for pylint with the required headers
- Search for
extension-pkg-whitelist=
line and appendPyQt5
to the line to make itextension-pkg-whitelist=PyQt5
- If you need to whitelist additional C extensions modules, they can be added in the same list separated by a comma. For example:
extension-pkg-whitelist=PyQt5,OtherPackage
In case, you do not want the hassle of passing individual modules, you can change unsafe-load-any-extension=no
to unsafe-load-any-extension=yes
in your .pylintrc
file. This will allow pylint to create AST for all C extensions.
Updating the VS Code pylint options
If you are not running pylint outside VS Code, you can update the pylint options for VS Code.
- Press
Ctrl+Shift+P
(Cmd+Shift+P
on OSX) - Search for setting and choose
Preferences: Open Settings (JSON)
- Add
"python.linting.pylintArgs": ["--extension-pkg-whitelist=PyQt5"]
to the settings dictionary
In case you want to whitelist any additional C extension modules, they can added after PyQt5
separated with a comma. For example: "python.linting.pylintArgs": ["--extension-pkg-whitelist=PyQt5,OtherPackage"]
Hope this helps.