27

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.

Anthony C
  • 1,990
  • 3
  • 23
  • 40
hjelpmig
  • 1,406
  • 6
  • 19
  • 23
  • What's the output of `which pylint` and where is your venv? – Maciej Gol Jul 29 '13 at 11:43
  • @kroolik it is /usr/bin/pylint and my virtualenv is ~/virtenvs/my_env/bin/python – hjelpmig Jul 29 '13 at 11:45
  • Did you install pylint with your venv enabled? Once you have installed pylint using `pip install pylint` with your venv active, `which pylint` should point to `~/virtenvs/my_envs/bin/pylint` – Maciej Gol Jul 29 '13 at 11:47
  • Yes I did installed pylint with my virtenv enabled. – hjelpmig Jul 29 '13 at 11:47
  • Have you got `~/virtenvs/my_env/bin/pylint` file? – Maciej Gol Jul 29 '13 at 11:48
  • Nope I dont have that file. So it means that there was something wrong when I installed pylint. But I am pretty sure that I did installed pylint with virtenv enabled. I enabled virtenv and then I used yum to install pylint with the following command sudu yum install pylint. – hjelpmig Jul 29 '13 at 11:51
  • `sudo` makes so it is installed in your global env. Install it using `pip install pylint` with your venv activated. – Maciej Gol Jul 29 '13 at 11:53
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/34372/discussion-between-mirchi002-and-kroolik) – hjelpmig Jul 29 '13 at 11:57

11 Answers11

50

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.

Noufal Ibrahim
  • 71,383
  • 13
  • 135
  • 169
24

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:\Some\Directory\You\Will\Leave\Alone
pip download --dest=C:\Some\Directory\You\Will\Leave\Alone pylint

Which will download pylint and its dependencies to C:\Some\Directory\You\Will\Leave\Alone and you can modify getlint.bat to read:

pip install pylint --find-links=C:\Some\Directory\You\Will\Leave\Alone

It will then use the pre-downloaded versions.

Steve Barnes
  • 27,618
  • 6
  • 63
  • 73
  • 3
    Steve is correct, I'll add that ^uninstalling^ it from your global python is also a good idea. That way you ensure you're running the correct pylint. – Brian Wylie Mar 05 '14 at 23:08
  • There goes a sad +1 since this is a real pain when using multiple (10+) virtualenvs. – mpiskore May 24 '17 at 13:52
  • 1
    @mpiskore - I have expanded the answer a little to make life easier. – Steve Barnes May 24 '17 at 18:07
  • I would like to add that if you created the virtualenv with `--system-site-packages` (e.g. because you use it to run your editor and don't want to debug issues with missing system packages), you may need to pass `--force-reinstall` to Pip. Alternatively `--ignore-installed` might also work, but I did not try that so I'm not sure and I cannot comment on what is better. – Zeust the Unoobian Nov 08 '18 at 10:57
8

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.

Jérôme
  • 13,328
  • 7
  • 56
  • 106
  • 1
    See here for the "no use env" rationale: https://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-interpreter_loc – Erik Aronesty Nov 18 '19 at 17:09
6

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
starlocke
  • 3,407
  • 2
  • 25
  • 38
  • 2
    Altering system programs like this for one user is not a good practice. – Noufal Ibrahim May 05 '15 at 21:10
  • @NoufalIbrahim Isn't this more like a bug from pylint developers that affects all of a system's users? – starlocke May 06 '15 at 05:00
  • Nope. It's a decision by the managers of the distro to make sure that the pylint will work as advertised and is independent of your local PATH settings. – Noufal Ibrahim May 06 '15 at 05:10
  • 1
    @NoufalIbrahim Oh... is that so? Very educational, good man. That's a big deal to chew on. Can I ask you to submit a better answer / workaround? I get the feeling that you have a novel solution using local PATH settings. – starlocke May 06 '15 at 15:23
  • @starlocke I don't understand what you're asking for. – Noufal Ibrahim May 06 '15 at 17:54
5

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.

Maciej Gol
  • 15,394
  • 4
  • 33
  • 51
2

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.

Omar Trejo
  • 727
  • 1
  • 6
  • 20
1

You can get there by calling the target python interpreter:

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

# or in an already active env
python -m pylint ...
ThorSummoner
  • 16,657
  • 15
  • 135
  • 147
1

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
gitaarik
  • 42,736
  • 12
  • 98
  • 105
0

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

mrArias
  • 1,008
  • 11
  • 7
0

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
UncleSaam
  • 346
  • 2
  • 8
0

For pylint installed globally, it can not recognize the packages installed inside the virtual environment, even if we are inside the virtual env. First, we can install pylint-venv in the global level (outside the virtual env):

pip install pylint-venv

Then inside the pyproject.toml file for this project, we can configure a init-hook for pylint:

[tool.pylint.main]
init-hook ="""
try:
  import pylint_venv
except ImportError:
  pass
else:
  pylint_venv.inithook()
"""

Tested on pylint 2.17, works well for me.

jdhao
  • 24,001
  • 18
  • 134
  • 273