У меня есть несколько сценариев 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")
Моя идея такова:
- сначала, я хотел бы перечислить все python файл с помощью команды linux (например: ls - l * .py),
- второй, сохраните результат в списке,
- в-третьих, для всех имен файлов в списке проверьте, совместимо ли оно с 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: строка исходного кода не может содержать нулевые байты
Я действительно не знаю, как исправьте эти нулевые байты. Может кто-нибудь поможет ???
Заранее благодарю