如果目录不包含__init__.py文件,则pylint会引发错误

时间:2017-12-29 14:24:33

标签: python-3.x pylint

我的文件夹只包含用于执行的python脚本。没有必要保留__init__.py文件。那么我可以忽略这样的错误吗?

$ pylint /app
Using config file /app/pylintrc
************* 
F:  1, 0: error while code parsing: Unable to load file /app/__init__.py:
[Errno 2] No such file or directory: '/app/__init__.py' (parse-error)

4 个答案:

答案 0 :(得分:6)

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G65

$ pylint --version
pylint 2.1.1
astroid 2.0.3
Python 3.7.0 (default, Jul 23 2018, 20:22:55) 
[Clang 9.1.0 (clang-902.0.39.2)]

更新

我通过尝试以下方法使它起作用:

$ cd /app
$ pylint *.py

或尝试:

$ pylint /path/to/app/*.py

并使整个工作正常进行。

...
Report
======
************* Module <yourmodname>
...
X statements analysed.

Statistics by type
------------------

+---------+-------+-----------+-----------+------------+---------+
|type     |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
...

错误

我试图做:

$ pylint .
************* Module .
__init__.py:1:0: F0010: error while code parsing: Unable to load file 
__init__.py:
[Errno 2] No such file or directory: '__init__.py' (parse-error)

答案 1 :(得分:2)

这是一个已知的PyLint问题:

lint all files in a directory (开放)

Consider supporting a folder of python files which is not a package (重复,已关闭)

不幸的是,正如我们在讨论中所看到的,没有人继续努力。

答案 2 :(得分:1)

此问题出现在我们的某些项目中。

在其中一个项目中,我们最近完成了一次成功的构建,但是突然所有事情开始无故失败。我们转到CI日志到上一次成功的构建,复制了已安装所有内容的确切版本。以这种方式构建时,一切正常。新版本将失败。

此项目的成功构建于 23.02.2019 ,而失败的构建于 25.02.2019 。没有引入实质性更改。以与以前相同的状态运行,再次失败...

为此花费了几个小时,我们发现:

  • 在调试时,其他错误开始发生。事实证明, 2019年2月27日的astroid released版本 2.2.0 基本上已经打破了pylint。将astroid固定回版本 2.1.0 可解决此问题。在他们发布补丁或pylint开始处理新版本之前,我们将一直保持这种状态。 Github上有一个issue

  • 解决了astroid问题,由于某些目录中缺少__init__.py文件(这些是Python 3.7项目,因此我们不需要空{ {1}}个文件...)

  • 进行了几次尝试,以找出旧组合为何有效而新组合无效的原因。经过大量失败的构建之后,我们发现 PATCH update是另一个来自{strong> 4.3.4。的__init__.py-pylint的依赖项。在 2019年2月25日发布的/ strong>至 4.3.5 中引入了该错误。将其固定回版本4.3.4很好。上面的任何东西都会失败。老实说,该更新未遵循语义版本控制的规则(肯定不是补丁程序版本,而是 MAJOR !)。

    < / li>

为什么是isort的确切原因,我现在还找不到,但是我决定在这里分享这些发现,这样可以节省数小时的反复试验。

TL; DR

将此添加到您的isort(至少直到下一个requirements.txt版本):

pylint

答案 3 :(得分:0)

我想出了这个解决方案(不适用于Windows):

pylint $(echo -n /app/*.py && echo -n ' ' && find /app -type d -maxdepth 1 -exec test -e '{}'/__init__.py \; -print | grep -v '^/app/\.')

因此,这将包括.py目录中的所有/app文件和/app目录中的所有目录(其根目录中包含__init__.py文件)的参数。 grep管道将从点开始删除/app中的所有目录名称。