Pylint: Error with pylint and Python 2.7.12

Created on 22 May 2018  路  12Comments  路  Source: PyCQA/pylint

Steps to reproduce

  1. Running with the latest version of pylint in Python 2.7.12 with the latest version results in an error.

Current behavior

Using /usr/lib/python2.7/dist-packages
Finished processing dependencies for ml-api==1.0
+ ./bin/pylint --rcfile .pylintrc api/
Traceback (most recent call last):
  File "./bin/pylint", line 11, in <module>
    load_entry_point('pylint==2.0.0.dev0', 'console_scripts', 'pylint')()
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/__init__.py", line 16, in run_pylint
    from pylint.lint import Run
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/lint.py", line 66, in <module>
    import astroid
  File "/usr/me/lib/python2.7/site-packages/astroid-2.0.0.dev0-py2.7.egg/astroid/__init__.py", line 57, in <module>
    from astroid.nodes import *
  File "/usr/me/lib/python2.7/site-packages/astroid-2.0.0.dev0-py2.7.egg/astroid/nodes.py", line 18, in <module>
    from astroid.node_classes import (
  File "/usr/me/lib/python2.7/site-packages/astroid-2.0.0.dev0-py2.7.egg/astroid/node_classes.py", line 649
    yield from ()
             ^
SyntaxError: invalid syntax

Expected behavior

Should not error.

pylint --version output

./bin/pylint --version
Problem importing module async.py: No module named builtins
Problem importing module async.pyc: No module named builtins
Problem importing module base.py: No module named builtins
Problem importing module base.pyc: No module named builtins
Problem importing module classes.py: cannot import name zip_longest
Problem importing module classes.pyc: cannot import name zip_longest
Problem importing module design_analysis.py: No module named builtins
Problem importing module design_analysis.pyc: No module named builtins
Problem importing module exceptions.py: No module named builtins
Problem importing module exceptions.pyc: No module named builtins
Problem importing module format.py: No module named builtins
Problem importing module format.pyc: No module named builtins
Problem importing module imports.py: No module named builtins
Problem importing module imports.pyc: No module named builtins
Problem importing module logging.py: No module named builtins
Problem importing module logging.pyc: No module named builtins
Problem importing module newstyle.py: No module named builtins
Problem importing module newstyle.pyc: No module named builtins
Problem importing module python3.py: No module named builtins
Problem importing module python3.pyc: No module named builtins
Problem importing module refactoring.py: No module named builtins
Problem importing module refactoring.pyc: No module named builtins
Problem importing module spelling.py: No module named builtins
Problem importing module spelling.pyc: No module named builtins
Problem importing module stdlib.py: No module named builtins
Problem importing module stdlib.pyc: No module named builtins
Problem importing module strings.py: No module named builtins
Problem importing module strings.pyc: No module named builtins
Traceback (most recent call last):
  File "./bin/pylint", line 9, in <module>
    load_entry_point('pylint==2.0.0.dev0', 'console_scripts', 'pylint')()
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/__init__.py", line 18, in run_pylint
    Run(sys.argv[1:])
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/lint.py", line 1292, in __init__
    linter.load_default_plugins()
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/lint.py", line 488, in load_default_plugins
    checkers.initialize(self)
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/checkers/__init__.py", line 120, in initialize
    register_plugins(linter, __path__[0])
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/utils.py", line 1165, in register_plugins
    module = modutils.load_module_from_file(join(directory, filename))
  File "/usr/local/lib/python2.7/dist-packages/astroid/modutils.py", line 272, in load_module_from_file
    return load_module_from_modpath(modpath, path, use_sys)
  File "/usr/local/lib/python2.7/dist-packages/astroid/modutils.py", line 233, in load_module_from_modpath
    module = imp.load_module(curname, mp_file, mp_filename, mp_desc)
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/checkers/typecheck.py", line 86
    yield from _flatten_container(item)
             ^
SyntaxError: invalid syntax

All 12 comments

I'm not exactly sure how did you install 2.0, it is working only with Python 3. If you do pip install with Python 2, it shouldn't find 2.0.

pip<9 + pip install --pre pylint will bring in 2.0.0-dev (a bit of an edge case I guess).

There could be something missing on my machine. Here is the current state. Let me add more details.

Installing using setuptools

/usr/me$ cat req.txt
pylint

/usr/me$ cat installer.py
#!/usr/bin/env python

import os
from setuptools import setup

setup_path = os.path.dirname(__file__)
with open(os.path.join(setup_path, './req.txt'), 'r') as reqs_file:
    reqs = reqs_file.readlines()
setup(
    name="me",
    version="1.0",
    description="me",
    author="me",
    author_email="[email protected]",
    url="",
    py_modules=[],
    install_requires=reqs,
)

/usr/me$ python installer.py install --prefix 
...
...
Searching for pylint
Reading https://pypi.python.org/simple/pylint/
Best match: pylint 2.0.0.dev0
Downloading https://files.pythonhosted.org/packages/ac/80/9b257ea15042d950ba4a30c54eb1a5dd1357e7d4173c29f89ae71fa65db0/pylint-2.0.0.dev0.tar.gz#sha256=abd4479080046eb186612cc2aa815d3550e0f918566f422e3728188a36674d05
Processing pylint-2.0.0.dev0.tar.gz
Writing /tmp/easy_install-cw0f70/pylint-2.0.0.dev0/setup.cfg
Running pylint-2.0.0.dev0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-cw0f70/pylint-2.0.0.dev0/egg-dist-tmp-4BsZzU
Not found: ['https://github.com/PyCQA/astroid/tarball/master#egg=astroid-master-2.0']
...
...
+ python --version
Python 2.7.12

+ pip --version
pip 9.0.3 from /usr/local/lib/python2.7/dist-packages (python 2.7)

+ ./bin/pylint --version
Problem importing module async.py: No module named builtins
Problem importing module async.pyc: No module named builtins
Problem importing module base.py: No module named builtins
Problem importing module base.pyc: No module named builtins
Problem importing module classes.py: cannot import name zip_longest
Problem importing module classes.pyc: cannot import name zip_longest
Problem importing module design_analysis.py: No module named builtins
Problem importing module design_analysis.pyc: No module named builtins
Problem importing module exceptions.py: No module named builtins
Problem importing module exceptions.pyc: No module named builtins
Problem importing module format.py: No module named builtins
Problem importing module format.pyc: No module named builtins
Problem importing module imports.py: No module named builtins
Problem importing module imports.pyc: No module named builtins
Problem importing module logging.py: No module named builtins
Problem importing module logging.pyc: No module named builtins
Problem importing module newstyle.py: No module named builtins
Problem importing module newstyle.pyc: No module named builtins
Problem importing module python3.py: No module named builtins
Problem importing module python3.pyc: No module named builtins
Problem importing module refactoring.py: No module named builtins
Problem importing module refactoring.pyc: No module named builtins
Problem importing module spelling.py: No module named builtins
Problem importing module spelling.pyc: No module named builtins
Problem importing module stdlib.py: No module named builtins
Problem importing module stdlib.pyc: No module named builtins
Problem importing module strings.py: No module named builtins
Problem importing module strings.pyc: No module named builtins
Traceback (most recent call last):
  File "./bin/pylint", line 9, in <module>
    load_entry_point('pylint==2.0.0.dev0', 'console_scripts', 'pylint')()
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/__init__.py", line 18, in run_pylint
    Run(sys.argv[1:])
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/lint.py", line 1292, in __init__
    linter.load_default_plugins()
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/lint.py", line 488, in load_default_plugins
    checkers.initialize(self)
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/checkers/__init__.py", line 120, in initialize
    register_plugins(linter, __path__[0])
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/utils.py", line 1165, in register_plugins
    module = modutils.load_module_from_file(join(directory, filename))
  File "/usr/local/lib/python2.7/dist-packages/astroid/modutils.py", line 272, in load_module_from_file
    return load_module_from_modpath(modpath, path, use_sys)
  File "/usr/local/lib/python2.7/dist-packages/astroid/modutils.py", line 233, in load_module_from_modpath
    module = imp.load_module(curname, mp_file, mp_filename, mp_desc)
  File "/usr/me/lib/python2.7/site-packages/pylint-2.0.0.dev0-py2.7.egg/pylint/checkers/typecheck.py", line 86
    yield from _flatten_container(item)
             ^
SyntaxError: invalid syntax

ah yeah, you're going through the easy_install / setuptools pathway and not the pip pathway -- I'd suggest pip install . w/ a setup.py instead :)

Thanks @asottile; I'll see whether that is possible for us.

Also seeing this via python setup.py test when pylint is in tests_require. Is your expectation that 2.0.0 would not be installed in this case for Python 2 or is a specific restriction required? I thought that modern versions of setuptools were supposed to behave the same as pip here.

EDIT: a quick grep in setuptools code suggests it does not respect this metadata, despite writing it out itself. Let me know if I missed something.

@sambrightman, are you asking me whether 2.0.0 shouldn't be installed for python 2.0?

If so, I am guessing not, as pylint 2.0.0 requires python 3. So, either setuptools should not fetch pylint 2.0.0 when running in python 2.7 that pylint 2.0.0 should be able to run on python 2.0. Ideally, it is the former.

I don't have time right now to check, but I thought that setuptools was smart enough to not install pylint if it detects that the Python version is incompatible to what pylint expects. At least I would have expected a more friendly error message rather than trying to install pylint and seeing the installation fail.

seems the python version stuff is a pip feature and not a setuptools feature -- setup.py install goes down the ~easy_install pathway which doesn't respect/handle python_requires

Easiest reproduction:

set -euxo pipefail
rm -rf venv setup.py
echo 'import setuptools;setuptools.setup(install_requires=["pylint"])' > setup.py
virtualenv venv -ppython2.7
venv/bin/python setup.py install || true
venv/bin/pip freeze --all | grep pylint
$ bash test.sh
...
Downloading https://files.pythonhosted.org/packages/52/cf/2ebc7d282f026e21eed4987e42e10964a077c13cfc168b42f3573a7f178c/typed-ast-1.1.0.tar.gz#sha256=57fe287f0cdd9ceaf69e7b71a2e94a24b5d268b35df251a88fef5cc241bf73aa
Best match: typed-ast 1.1.0
Processing typed-ast-1.1.0.tar.gz
Writing /tmp/easy_install-pzo5UK/typed-ast-1.1.0/setup.cfg
Running typed-ast-1.1.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-pzo5UK/typed-ast-1.1.0/egg-dist-tmp-MWGpiV
error: Setup script exited with Error: typed_ast only runs on Python 3.3 and above.
+ true
+ venv/bin/pip freeze --all
+ grep pylint
pylint==2.0.0.dev1

imo there's zero reason to use setup.py install / easy_install / etc. in "modern" python development (use pip install ... instead!) so this is probably not worth worrying about.

@asottile is right on this one.

OK ... in that case, we will include moving to pip in our plans.

I already use pip install but python setup.py test for testing. This invokes setuptools with the problem already mentioned by @asottile. Workaround to keep using this method is explicit version specifier in setup.py.

Was this page helpful?
0 / 5 - 0 ratings