簡體   English   中英

對目錄和所有子目錄中的所有 Python 個文件運行 Pylint

[英]Run Pylint for all Python files in a directory and all subdirectories

我有

find . -iname "*.py" -exec pylint -E {} ;\

FILES=$(find . -iname "*.py")
pylint -E $FILES

如果我理解正確,第一個命令將為 Python 個文件中的每一個運行 pylint,第二個命令將為所有文件運行一次 pylint。 我預計這兩個命令會返回相同的 output,但它們會返回不同的結果。 我認為這個差異在某種程度上與導入和 F(失敗)pylint 消息有關,這在導入失敗時發生並且不是pylint -E 的 output。

是否有人已經經歷過這種情況並且可以解釋為什么會發生差異以及運行 pylint 的最佳方式是什么?

只需將目錄名稱傳遞給 pylint 命令。 要 lint ./server所有文件:

pylint server

我的一分錢

find . -type f -name "*.py" | xargs pylint 

它是如何工作的?

find發現所有以py結尾的文件並傳遞給xargsxargs在每個文件上運行pylint命令。

注意:您也可以為pylint命令提供任何參數。

編輯:

根據文檔我們可以使用

  1. pylint mymodule.py

  2. pylint directory/mymodule.py

  3. pylint ./module

如果目錄是一個 python 包(即有一個__init__.py文件或者它是一個隱式命名空間包)或者如果“目錄”在 python 路徑中,數字 2將起作用。

要對目錄及其子目錄中的所有 *.py 文件運行 pylint,您可以運行:

shopt -s globstar  # for Bash
pylint ./**/*.py

要在 Git 版本控制中的所有代碼上運行 Pylint,

pylint $(git ls-files '*.py')

非常快,因為 Git 已經知道您所有文件的名稱。 它也適用於缺少 Bash 4 的 macOS。但是它不會對非常新且尚未被git add編輯到存儲庫的文件進行 lint。

感謝國寶 Julia Evans 的git ls-files技巧——這是她的原始用例,使用“entr”自動化工作流程: https : //jvns.ca/blog/2020/06/28/entr/

pytestpytest-pylint可以平凡運行在所有的Python文件pylint的:

在項目根目錄下的setup.cfg文件中,確保至少有:

[tool:pytest]
addopts = --pylint 

接下來,在命令行上運行pytest

[根據評論中的有用補充進行更新]

如果目錄中沒有__init__.py文件,並且出於各種原因不想這樣做,我的做法是

touch __init__.py; pylint $(pwd); rm __init__.py

如果您在該目錄中已經有一個__init__.py文件,它將被刪除

如果您發現自己經常需要此功能,您應該創建一個以更安全的方式執行此操作的函數,以保留預先存在的__init__.py文件。 例如,您可以將以下pylint_all_the_things函數放在您的~/.bashrc文件中。 (最后一行導出函數,以便可以從任何子shell 調用它。)如果您不想編輯.bashrc ,您可以將函數主體放在一個可執行的 shell 腳本文件中。

此函數默認在當前目錄中運行 pylint,但您可以指定要用作第一個函數參數的目錄。

# Run pylint in a given directory, defaulting to the working directory
pylint_all_the_things() {
    local d=${1:-$(pwd)}

    # Abort if called with a non-directory argument.
    if [ ! -d "${d}" ]; then
        echo "Not a directory: ${d}"
        echo "If ${d} is a module or package name, call pylint directly"
        exit 1
    fi

    local module_marker="${d}/__init__.py"

    # Cleanup function to later remove __init__.py if it doesn't currently exist
    [[ ! -f ${module_marker} ]] && local not_a_module=1
    cleanup() {
        (( ${not_a_module:-0} == 1 )) && rm "${module_marker}"
    }
    trap cleanup EXIT

    # Create __init__.py if it doesn't exist
    touch "${module_marker}"
    pylint "${d}"
    cleanup
}
export -f pylint_all_the_things

trap實用程序用於確保即使調用pylint失敗並且您已啟用set -e也會進行清理,這會導致函數在到達清理行之前退出。

如果您想在當前工作目錄和所有子文件夾上遞歸調用pylint ,您可以執行以下操作

for dir in ./**/ ; do pylint_all_the_things "$dir"; done

這將需要在 bash 中啟用shopt -s globstar ( shopt -s globstar )。

我在根目錄下使用:

pylint *

您是否嘗試過探礦者( https://pypi.org/project/prospector/ )或 pylint_runner( https://pypi.org/project/pylint_runner/

如果您想運行您的自定義配置文件,請使用以下命令

pylint --rcfile=.pylintrc <directory_name>

已經有這個問題,希望很快得到解決。

如果你不喜歡使用xargs你可以做一個簡單的 find-exec:

find . -type f -name "*.py" -exec pylint -j 0 --exit-zero {} \;


我對pylint Project-Dir是所有絕對導入都不起作用。

我使用“pylint_runner”來對目錄和子目錄中的所有文件運行 pylint。 蟒蛇 3.7.4

pylint_runner 0.54

pylint 2.4.1

https://pypi.org/project/pylint_runner/

這是從 Docker 容器運行它的命令:

docker run -i --rm --name my_container \
  -v "$PWD":"$PWD" -w "$PWD" \
    python:3.7 \
      /bin/sh -c "pip3 install -r requirements.txt; pylint_runner -v"

requirements.txt - 應存在於“$PWD”目錄中並包含“pylint_runner”條目。

如果您的目標是對當前工作目錄和子文件夾中的所有文件運行 pylint,這是一種解決方法。 此腳本在當前目錄上運行 pylint。 如果__init__.py不存在,它會創建它,運行 pylint,然后刪除它。

#! /bin/bash -
if [[ ! -e __init__.py ]]; then
    touch __init__.py
    pylint `pwd`
    rm __init__.py
else
    pylint `pwd`
fi

要在所有子目錄中運行 Pylint,

pylint $(find [a-z]* -type d)

這種解決方案比其他解決方案更簡單、更直接。 它無需設置即可工作,包括在沒有 Bash 4 的 macOS 上。

[az]*的原因是因為大多數項目都有 Git 或其他魔法子目錄,這會污染結果。 如果您有以大寫字母開頭的子目錄,請使用以下變體:

pylint $(find [a-zA-Z]* -type d)

using./server 或類似的東西只有在所有子目錄中都有__init__.py時才有效,它不會匹配所有子目錄中的所有 python 文件。 使用 find 和 xargs 是一個選項,但這也有效:

pylint **py

  1. touch __init__.py當前目錄下的touch __init__.py
  2. 在您希望 pylint 查看的每個子目錄中touch __init__.py
  3. pylint $(pwd) (或等效的pylint /absolute/path/to/current/directory

pylint文檔提到了一個--recursive標志,它告訴 pylint 自己查找所有模塊和包,而無需用戶手動指定所有模塊和包。

因此,您需要做的就是:

pylint --recursive=y .

看起來該標志是在 pylint v2.13.0中引入的,但似乎從 v2.15.0 開始,您將不需要--recursive標志,這將是 pylint 的默認行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM