私は持っています
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を実行する最良の方法は何ですか?
私の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パスにある場合。
ディレクトリ名をpylintコマンドに渡すだけです。 ./server
内のすべてのファイルをリントするには:
pylint server
実行できるディレクトリ内のすべてのpythonファイル:
pylint *.py
pylint **/*.py
[コメントへの有用な追加に基づいて更新]
ディレクトリに__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
)。
Psospector( https://pypi.org/project/prospector/ )またはpylint_runner( https://pypi.org/project/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
これの問題 が既にあり、うまくいけばすぐに修正されるでしょう。
xargs
を使用したくない場合は、単純なfind-execを実行できます。
find . -type f -name "*.py" -exec pylint -j 0 --exit-zero {} \;
pylint Project-Dir
で発生した問題は、すべての絶対インポートが機能していなかったことです。
また、カスタム構成ファイルを実行する場合は、以下のコマンドを使用します
pylint --rcfile=.pylintrc <directory_name>
touch __init__.py
_は現在のディレクトリにありますtouch __init__.py
_は、pylintに表示させたいすべてのサブディレクトリにありますpylint $(pwd)
(または同等に_pylint /absolute/path/to/current/directory
_)