web-dev-qa-db-ja.com

ディレクトリ内のすべてのPythonファイルに対してPylintを実行する方法

私は持っています

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

そして

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

正しく理解すれば、最初のコマンドは各Pythonファイルに対してpylintを実行し、2番目はすべてのファイルに対してpylintを1回実行します。両方のコマンドが同じ出力を返すと予想しましたが、この差分は、インポートと、インポートが失敗したときに発生するF(失敗)pylintメッセージに何らかの関係があると思います。これはnot pylint -Eによって出力されます。

誰かがすでにこれを経験していて、なぜdiffが発生するのか、pylintを実行する最良の方法は何ですか?

34

私の1セント

find . -iname "*.py" | xargs pylint 

どのように機能しますか?

findは、すべてのファイルがpyで終わることを検出し、xargsに渡すと、xargsは各ファイルでpylintコマンドを実行します。

注:pylintコマンドにも任意の引数を指定できます。

編集:

doc に従って

[1] pylint mymodule.py

[2] pylint directory/mymodule.py

[2]は、ディレクトリがpythonパッケージ(つまり、__init__.pyファイルまたは暗黙のネームスペースパッケージ)または「ディレクトリ」がpythonパスにある場合。

32
sonus21

ディレクトリ名をpylintコマンドに渡すだけです。 ./server内のすべてのファイルをリントするには:

pylint server
25
duhaime

実行できるディレクトリ内のすべてのpythonファイル:

pylint *.py
pylint **/*.py
15
chilicheech

[コメントへの有用な追加に基づいて更新]

ディレクトリに__init__.pyファイルがなく、さまざまな理由でしたくない場合、私のアプローチは

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

そのディレクトリにすでに__init__.pyファイルがある場合、それは削除済みになります。

この機能が頻繁に必要な場合は、既存の__init__.pyファイルを保持しながらこれを行う関数を作成する必要があります。たとえば、次のコードを~/.bashrcファイルに入れて、pylint_all_the_thingsをエクスポートして、任意のサブシェルから呼び出せるようにすることができます。または、関数の本体を実行可能なスクリプトに入れることもできます。

この関数はデフォルトで現在のディレクトリで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でglobstarを有効にする必要があります(shopt -s globstar)。

4
Ryan Feeley

Psospector( https://pypi.org/project/prospector/ )またはpylint_runner( https://pypi.org/project/pylint_runner/ )を試しましたか

2
NN_

現在の作業ディレクトリとサブフォルダー内のすべてのファイルに対してpylintを実行することが目標である場合、次の回避策があります。このスクリプトは、現在のディレクトリでpylintを実行します。 __init__.pyは存在せず、作成し、pylintを実行してから削除します。

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

これの問題 が既にあり、うまくいけばすぐに修正されるでしょう。

xargsを使用したくない場合は、単純なfind-execを実行できます。

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


pylint Project-Dirで発生した問題は、すべての絶対インポートが機能していなかったことです。

1
holzkohlengrill

また、カスタム構成ファイルを実行する場合は、以下のコマンドを使用します

pylint --rcfile=.pylintrc <directory_name>
1
Santosh Pillai
  1. _touch __init__.py_は現在のディレクトリにあります
  2. _touch __init__.py_は、pylintに表示させたいすべてのサブディレクトリにあります
  3. pylint $(pwd)(または同等に_pylint /absolute/path/to/current/directory_)
0
krubo