Как запустить Pylint для всех файлов Python в каталоге
У меня
find . -iname "*.py" -exec pylint -E {} ;\
и
FILES=$(find . -iname "*.py")
pylint -E $FILES
Если я правильно понял, первая команда будет запускать pylint для каждого из файлов Python, вторая будет запускать pylint один раз для всех файлов. Я ожидал, что обе команды вернут один и тот же результат, но они возвратят разные результаты. Я думаю, что этот diff каким-то образом связан с импортными сообщениями и сообщениями об ошибках F (fail), которые возникают, когда импорт завершается с ошибкой и не выводится командой pylint -E.
Кто-то уже испытал это и мог объяснить, почему происходит diff, и каков наилучший способ запуска pylint?
Ответы
Ответ 1
Мой один цент
find . -iname "*.py" | xargs pylint
Как это работает?
find
находит все файлы, заканчивающиеся на py
и передаваемые в xargs
, xargs
запускает команду pylint
для каждого файла.
ПРИМЕЧАНИЕ. Вы также можете указать любой аргумент для команды pylint
.
EDIT:
Согласно документу мы можем использовать
pylint mymodule.py
справочник pylint/mymodule.py
число 2 будет работать, если каталог представляет собой пакет Python (то есть имеет файл __init__.py
или это неявный пакет пространства имен) или если "каталог" находится в пути Python.
Ответ 2
Просто передайте имя каталога команде pylint. Чтобы вставить все файлы в ./server
:
pylint server
Ответ 3
Для всех файлов Python в каталоге вы можете запустить:
pylint *.py
Для всех файлов python в каталоге и его подкаталогах вы можете запустить: pylint **/*.py
Ответ 4
[ОБНОВЛЕНО на основе полезных дополнений в комментариях]
Если у вас нет файла __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 does not 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 does not 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
Что потребует, чтобы globstar был включен в bash (shopt -s globstar
).
Ответ 5
Вы пробовали psospector (https://pypi.org/project/prospector/) или pylint_runner (https://pypi.org/project/pylint_runner/)
Ответ 6
Уже существует проблема для этого, и мы надеемся, что ее скоро исправят.
Если вы не предпочитаете использовать xargs
, вы можете просто выполнить find-exec:
find . -type f -name "*.py" -exec pylint -j 0 --exit-zero {} \;
Проблема, с которой я столкнулся в pylint Project-Dir
, заключается в том, что весь абсолютный импорт не работал.
Ответ 7
Я использую "pylint_runner" для запуска pylint для всех файлов в каталоге и подкаталогах.
Python 3.7.4
pylint_runner 0.54
Пилинт 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".
Ответ 8
Если ваша цель - запустить pylint для всех файлов в текущем рабочем каталоге и подпапках, вот один из обходных путей. Этот скрипт запускает pylint в текущем каталоге. Если __init__.py
не существует, он создает его, запускает pylint, а затем удаляет его.
#! /bin/bash -
if [[ ! -e __init__.py ]]; then
touch __init__.py
pylint 'pwd'
rm __init__.py
else
pylint 'pwd'
fi
Ответ 9
И если вы хотите запустить свой пользовательский файл конфигурации, используйте команду ниже
pylint --rcfile=.pylintrc <directory_name>
Ответ 10
-
touch __init__.py
в текущем каталоге -
touch __init__.py
в каждом подкаталоге, на который вы хотите, чтобы pylint посмотрел -
pylint $(pwd)
(или эквивалентно pylint/absolute/path/to/current/directory
)