[英]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
結尾的文件並傳遞給xargs
, xargs
在每個文件上運行pylint
命令。
注意:您也可以為pylint
命令提供任何參數。
編輯:
根據文檔我們可以使用
pylint mymodule.py
pylint directory/mymodule.py
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/
pytest
與pytest-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
touch __init__.py
當前目錄下的touch __init__.py
touch __init__.py
pylint $(pwd)
(或等效的pylint /absolute/path/to/current/directory
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.