Как запустить 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:

Согласно документу мы можем использовать

  1. pylint mymodule.py

  2. справочник 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).

Ответ 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

  1. touch __init__.py в текущем каталоге
  2. touch __init__.py в каждом подкаталоге, на который вы хотите, чтобы pylint посмотрел
  3. pylint $(pwd) (или эквивалентно pylint/absolute/path/to/current/directory)