Зависит от того, как именно проект упаковали. Если внутри лежат файлы кеша байт-кода — переработанного представления программы, которое интерпретатор — программа, которая исполняет Python, создаёт сам, чтобы не разбирать исходник при каждом запуске, — их можно разобрать и во многом восстановить логику; заодно из служебной метки видно, какой версией интерпретатора они созданы. Если приложение упаковано вместе с интерпретатором — например, собрано PyInstaller, — обычно удаётся извлечь тот же байт-код. Если же проект переведён в машинный код через Cython или Nuitka, восстановление исходного текста в прежнем смысле невозможно, и исследование ограничивается наблюдаемым поведением и структурой.
Ограничения везде те же. Комментарии автора в кеш байт-кода не попадают, а средства восстановления заметно отстают от новых версий языка: для свежего интерпретатора подходящего инструмента может не оказаться вовсе, и это ограничение, а не вопрос точности. Сам восстановленный текст — это реконструкция, автор писал не так; в заключении это указывают.
Если исходный код существует, но сторона его не передала, эксперт отмечает это как ограничение исследования, а вопрос об истребовании материалов решает суд или лицо, назначившее экспертизу.