Re: [code-quality] [EXTERNAL] Re: How does pylint find files to process
On 08/08/14 13:15, Claudiu Popa wrote:
On Thu, Aug 7, 2014 at 9:57 PM, Mark E. Hamilton <mhamilt@sandia.gov> wrote:
Hi,
I'm having trouble figuring out how pylint finds python files to process. If I find() all the .py files in my project and pass them on the command line pylint processes them correctly (after I set up PYTHONPATH, of course.)
However, if I just pass my project directory to pylint it fails with:
F: 1, 0: error while code parsing: Unable to load file '.../__init__.py' ([Errno 2] No such file or directory: '.../__init__.py') (parse-error)
If I create an empty __init__.py file it works, but only finds and processes some of the files. This seems to imply that I need to created __init__.py files in my entire tree. Is that the case?
Yes, that's the case, you need __init__.py files in order to tell pylint that those are packages. Pylint doesn't support (yet) Python 3's implicit namespace packages (PEP 420).
FWIW, we're using these versions: ceerws3111a 1123% pylint --version No config file found, using default configuration pylint 1.2.1, astroid 1.1.1, common 0.61.0 Python 2.7.4 (default, Aug 26 2013, 10:48:13) [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] IAE, perhaps this is just a misunderstanding we have about python. All of our python scripts work, and we've never had __init__.py files in every subdirectory. What you say would imply that even directories which contain no python files have to have a __init__.py file. For instance, if I have this: % find . . ./test_dir1 ./test_dir1/subdir1 ./test_dir1/subdir1/test1.py it seems that I would have to create __init__.py files in '.', test_dir1, and subdir1, even though '.' and test_dir1 don't contain any python files. However, to test this I ran pylint this way: pylint ${PWD} I get the 'Unable to load' error I reported above. This touch __init__.py pylint ${PWD} only processes the __init__.py file, as expected from what you said, and reports a missing-dosctring. However, when I do this pylint throws traceback. touch test_dir1/__init__.py pylint ${PWD} No config file found, using default configuration Traceback (most recent call last): File "/projects/sierra/linux_rh6/install/Python/2.7/bin/pylint", line 9, in <module> load_entry_point('pylint==1.2.1', 'console_scripts', 'pylint')() File "/projects/sierra/linux_rh6/install/Python/2.7/lib/python2.7/site-packages/pylint-1.2.1-py2.7.egg/pylint/__init__.py", line 21, in run_pylint Run(sys.argv[1:]) File "/projects/sierra/linux_rh6/install/Python/2.7/lib/python2.7/site-packages/pylint-1.2.1-py2.7.egg/pylint/lint.py", line 1051, in __init__ linter.check(args) File "/projects/sierra/linux_rh6/install/Python/2.7/lib/python2.7/site-packages/pylint-1.2.1-py2.7.egg/pylint/lint.py", line 608, in check for descr in self.expand_files(files_or_modules): File "/projects/sierra/linux_rh6/install/Python/2.7/lib/python2.7/site-packages/pylint-1.2.1-py2.7.egg/pylint/lint.py", line 638, in expand_files result, errors = expand_modules(modules, self.config.black_list) File "/projects/sierra/linux_rh6/install/Python/2.7/lib/python2.7/site-packages/pylint-1.2.1-py2.7.egg/pylint/utils.py", line 648, in expand_modules submodname = '.'.join(modpath_from_file(subfilepath)) File "/projects/sierra/linux_rh6/install/Python/2.7/lib/python2.7/site-packages/logilab_common-0.61.0-py2.7.egg/logilab/common/modutils.py", line 250, in modpath_from_file filename, ', \n'.join(sys.path))) ImportError: Unable to find module for /ascldap/users/mhamilt/project/test_dir1/__init__.py in /home/mhamilt, /projects/sierra/linux_rh6/install/Python/2.7.4/bin, ... Creating __init__.py in subdir1 doesn't resolve this traceback, nor does creating a python file in test_dir1. However, setting PYTHONPATH to this export PYTHONPATH=${PWD}/test_dir1 pylint ${PWD} does resolve the traceback, and pylint processes the two __init__.py files. Finally, doing this touch test_dir1/subdir1/__init__.py % find . . ./test_dir1 ./test_dir1/__init__.py ./test_dir1/subdir1 ./test_dir1/subdir1/test1.py ./test_dir1/subdir1/__init__.py ./test_dir2 ./test_dir2/subdir2 ./test_dir2/subdir2/test2.py ./__init__.py pylint ${PWD} works, processes all three __init__.py files and the test1.py file. If I unset PYTHONPATH the traceback returns. I don't understand: 1. Why pylint is throwing a traceback 2. Why setting PYTHONPATH to the directory in the middle is necessary. 3. Why creating all those __init__files is necessary. -- ---------------- Mark E. Hamilton Engineering Sciences Center Senior Member of Technical Staff Sandia National Laboratories 505-844-7666
participants (1)
-
Mark E. Hamilton