Я экспериментирую с Cython и возможностями обфускации кода ( статья ). В этой статье особо отмечено:
Когда компиляция завершена, невозможно скомпилировать библиотеки обратно в читаемый исходный код Python!
Я использую этот вопрос Информация для компиляции моего кода в автономном исполняемом файле.
В моем понимании и, как упоминалось в статье 1 , Cython переводит код Python в код C с соответствующими вызовами библиотеки Python (это правильно?). В других случаях у нас есть только файл C в качестве вывода, и он не может быть декомпилирован обратно, как файлы .pyc.
Мой тестовый код очень прост:
def my_crashing_function():
x = "1"
y = 2
test = x + y # we will crash here
if __name__ == "__main__":
my_crashing_function()
Но когда я запускаю этот исполняемый файл (после cython --embed -o test.c main.py
и gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl -s
)
Я получаю ошибку, как это:
user@debian:~# ./hello
Traceback (most recent call last):
File "main.py", line 7, in init main
my_crashing_function()
File "main.py", line 4, in main.my_crashing_function
test = x + y # we will crash here
TypeError: Can't convert 'int' object to str implicitly
Как видите, у нас есть трассировка со всеми именами методов, правильными именами переменных и строками, даже с оригинальными комментариями исходного кода. Если мы переименуем переменную или изменим комментарий - он также будет изменен при трассировке.
Я не понимаю, как traceback может отображать всю эту информацию. Это может работать таким образом, только если полный исходный код также хранится в исполняемом файле.
Пожалуйста, объясните мне, где я не прав?
Обновление. Traceback в моей ситуации был сгенерирован из оригинального .py файла. Этот файл находился в той же папке, что и скомпилированный исполняемый файл, и только благодаря этому я получил весь исходный код и комментарии в traceback. После удаления оригинального .py файла трассировка будет содержать только тип исключения и номера строк, без другой информации.