pylint doesn't point to virtualenv python

Question:

I am pretty new to python and currenty I am trying to use pylint for checking code quality. I am getting a problem. My pylint doesn’t point to virtualenv python interpreter. Here is the output that I get when I run pylint –version

 $ pylint --version
   pylint 0.21.1,
   astng 0.20.1, common 0.50.3
   Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
   [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)]

In virtualenv I have python 2.7 installed. Will appretiate you help if someone can point me to how to solve that.

Asked By: hjelpmig

||

Answers:

I am fairly sure that you need to install pylint under your virtual environment and then run that instance of it.

Update – Make life easier:

I would suggest that anybody working a lot in virtual environments create a batch file, (in a known location or on the path), or bash script with something like the following called something like getlint.bat:

pip install pylint

Invoking this after activating the virtual environment will install pylint into that virtual environment. If you are likely to be offline or have a poor internet connection you can, once when you have a good internet connection, (possibly once for each of python 2 & 3):

mkdir C:SomeDirectoryYouWillLeaveAlone
pip download --dest=C:SomeDirectoryYouWillLeaveAlone pylint

Which will download pylint and its dependencies to C:SomeDirectoryYouWillLeaveAlone and you can modify getlint.bat to read:

pip install pylint --find-links=C:SomeDirectoryYouWillLeaveAlone

It will then use the pre-downloaded versions.

Answered By: Steve Barnes

The issue has been solved on chat (link in comments).

The problem lied in using sudo yum install pylint, because it installed pylint in the global env. The solution was to use the following command:

pip install -i http://f.pypi.python.org/simple pylint

Note the -i usage as the regular index seemed to be broken for the asker.

Answered By: Maciej Gol

A cheap trick is to run (the global) pylint using the virtualenv python. You can do this using python $(which pylint) instead of just pylint. On zsh, you can also do python =pylint.

Answered By: Noufal Ibrahim

I ran into this problem, too. My solution was simply to edit the pylint program’s shebang, like so… (your path to pylint may be different than mine, though)

$ sudo vim /usr/bin/pylint

Replacing:

#!/usr/bin/python

With:

#!/usr/bin/env python
Answered By: starlocke

You can get there by calling the target python interpreter:

./env/bin/python -m pylint ...

# or in an already active env
python -m pylint ...
Answered By: ThorSummoner

Noufal Ibrahim’s answer works if you execute pylint manually.

If you execute pylint from you editor/IDE, you need to configure the plugin correctly.

It can get tricky. This may be considered a bug of each IDE/plugin, but that’s how it is.

Modifying /usr/bin/pylint to write #!/usr/bin/env python as suggested in another answer fixes this for every use of pylint (manual use, or any editor integration).

However, at least in Debian, using #!/usr/bin/python is a design choice, not a bug. See here for the rationale.

To avoid modifying that system file, one can create a copy of /usr/bin/pylint in /usr/local/bin:

cp /usr/bin/pylint /usr/local/bin/pylint
vi usr/local/bin/pylint # Edit the file to use /usr/bin/env python

This won’t be broken by a pylint update, but still infringes Debian’s “strongly preferred choice”.

This method requires root privileges. An unprivileged user may create an alias

alias pylint='/usr/bin/env python $(which pylint)'.

I always develop in virtualenv and I setup a postmkvirtualenv hook to install pylint and flake8 automatically when creating a virtualenv, so I don’t use the versions ditributed by debian anymore.

Answered By: Jérôme

I know it’s been a while since this question was answered, but I just thought I should leave this post here in case someone else runs into the same problem.

If for some reason you need to keep pylint in the global space instead of your virtual environment, you can use the recommendation in here: PyLint + VirtualEnv.

It basically says to configure your pylint using the init-hook and encoding version of a Python program that will use the global pylint and load the rest of the environment.

Answered By: Omar Trejo

I’m using the Syntastic + Pylint combination, and since I have many different virtualenvs that I can work on at any given time, I’ve created a wrapper over the virtualenv command that, among some other things, installs pylint after all the requirements.

That way, whenever I activate a virtualenv, I’ll get its own pylint version.

Hope this helps, and thanks for the tip on deleting the global one from @briford-wylie

Answered By: mrArias

Ran into the same problem just today. Continuing on ThorSummoner‘s answer, when using Pylint with pylint-django inside of a virtual environment such as Pipenv, make sure to call pylint using the target python interpreter (python -m pylint)

A good approach, which will work locally and on your CI as well is to write-down the lint command in the script section of your Pipfile:

[scripts]
lint = "python -m pylint [--options] all-my-modules-names..."

Then calling pylint is as easy as :

pipenv run lint
Answered By: UncleSaam

When you’re using Pipenv / virtualenv, install pylint inside the virtualenv:

pipenv install --dev pylint

or, if you don’t use Pipenv, install it with pip after you activated your virtualenv:

# activate virtualenv, e.g. `. env/bin/activate`
pip install pylint
Answered By: gitaarik
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.