проверьте, совместим ли сценарий python с python3 - PullRequest
0 голосов
/ 05 мая 2020

У меня есть несколько сценариев python, и для проекта миграции я хотел бы создать сценарий, который открывает каждый файл python и синтаксически проверяет, совместим ли он с python3.

Я уже обнаружил, что кто-то публикует решение здесь . код:

def test_source_code_compatible(code_data):
    try:
        return ast.parse(code_data)
    except SyntaxError as exc:
        return False

ast_tree = test_source_code_compatible(open('file.py').read())
if not ast_tree:
    print("File couldn't get loaded")

Моя идея такова:

  1. сначала, я хотел бы перечислить все python файл с помощью команды linux (например: ls - l * .py),
  2. второй, сохраните результат в списке,
  3. в-третьих, для всех имен файлов в списке проверьте, совместимо ли оно с python3, используя приведенное выше код решение.

это пример кода, который я написал:

def get_list_file(command):
    proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr = subprocess.PIPE)
    output = proc.communicate()[0].decode('utf-8')
    return output

def test_source_code_compatible(code_data):
    try:
        return ast.parse(code_data)
    except SyntaxError:
        return False

def main():
    command = "ls -l *.py'"

    a_list = get_list_file(command).split('\n')
    filter_object = filter(lambda x: x != "", a_list) # to remove empty element in the list
    list_script = list(filter_object)

    for i in list_script:
        with open('{}'.format(str(i)),'r') as file:
            reader = file.read()
            ast_tree = test_source_code_compatible(reader)

            if not ast_tree:
                print("\"{}\": does not work with python3 !!".format(file.name))

if __name__ == '__main__':
    main()

при запуске кода я получил ошибку:

UnicodeDecodeError : код 'utf-8' c не может декодировать байт «0xcd» в позиции 77

Затем я обработал ошибку с помощью try, кроме UnicodeDecodeError, изменив эту строку:

с open ('{}'. Format (str (i)), 'r', encoding = 'latin-1', errors = 'ignore') как файл

и после получения этой новой ошибки:

return ast.parse (code_data) \ n ValueError: строка исходного кода не может содержать нулевые байты

Я действительно не знаю, как исправьте эти нулевые байты. Может кто-нибудь поможет ???

Заранее благодарю

...