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

Ole*_*kyi 9 pylint python-3.x

我有一个只包含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)
Run Code Online (Sandbox Code Playgroud)

Jay*_*zzo 7

$ 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)]
Run Code Online (Sandbox Code Playgroud)

更新

尝试通过以下方式实现此目的:

$ cd /app
$ pylint *.py
Run Code Online (Sandbox Code Playgroud)

或尝试:

$ pylint /path/to/app/*.py
Run Code Online (Sandbox Code Playgroud)

让整个事情发挥作用.

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

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

+---------+-------+-----------+-----------+------------+---------+
|type     |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
...
Run Code Online (Sandbox Code Playgroud)

错误

我试过这样做:

$ 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)
Run Code Online (Sandbox Code Playgroud)

  • 只是添加到 @JayRizzo 的回复,如果您只想在 python 文件上运行 pylint,请使用 `$ pylint /path/to/folder/*.py` 如果您不使用它,它将在所有目录中的文件(例如:README.md)。您不想在非 python 文件上运行 pylint。 (2认同)
  • 看起来更好的命令:`find api/python/cli -name "*.py" | xargs pylint`。这样,如果 python 文件位于目录层次结构中,它将起作用。 (2认同)

Ole*_*nko 6

这是 PyLint 的一个已知未决问题:

lint 目录中的所有文件 (打开)

考虑支持一个不是包的python文件文件夹 (重复,关闭)

不幸的是,正如我们在讨论中看到的那样,没有人继续研究它。

  • 现已在 2022 年 4 月 6 日发布的 Pylint 2.13.5 中解决。使用“--recursive”选项激活新功能。 (2认同)

Vic*_*der 6

这个问题在我们的一些项目中出现过。

在其中一个项目中,我们最近进行了一次成功的构建,但突然一切都开始无缘无故地失败。我们查看了上次成功构建的 CI 日志,复制了安装的所有内容的确切版本。当以这种方式构建时,一切都正常。新版本将会失败。

该项目的成功构建时间为2019 年 2 月 23 日,失败的构建时间为2019 年 2 月 25 日。没有引入实质性改变。以与之前相同的状态运行,再次失败......

我们又投入了几个小时,发现:

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

  • 问题astroid解决后,我们又回到了由于__init__.py某些目录中缺少文件而失败的情况(这些是 Python 3.7 项目,我们不需要空__init__.py文件...)

  • 我们进行了多次尝试来找出为什么旧组合有效而新组合无效的原因。经过多次失败的构建后,我们发现另一个依赖项的PATCH 更新pylint——isort4.3.44.3.5(于2019 年 2 月 25 日发布)引入了该错误。将其固定回 4.3.4 版本效果很好。任何高于它的都会失败。老实说,该更新没有遵循语义版本控制的规则(它绝对不是补丁版本......它更有可能是一个重大版本!)。

到底为什么isort会造成这种情况,我还没有找到,但我决定在这里分享这些发现,这样您就可以节省几个小时的试验和错误。

长话短说

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

# astroid 2.2.0 seems to break everything in pylint
astroid==2.1.0
# isort above 4.3.4 introduces the "__init__.py not found" issue
isort==4.3.4
Run Code Online (Sandbox Code Playgroud)