Доброго времени суток!
Опишу ситуацию: имеется простенький python проект (который, на самом деле, без учёта подключенных модулей, представляет из себя один .py файл). Конечный пользователь получает его в виде .exe, собранного через тот же auto-py-to-exe или py2exe (не знаю, что точно буду использовать, пока что этим вопросом не задавался). В ответ на мой вопрос "А сможет ли конечный пользователь разобрать этот .exe и получить исходный код?" гугл ответил: "Да, конечно, ему даже не придется прикладывать особых усилий".
Итак, я поставил себе задачу: защитить проект от получения исходного кода пользователем, который дальше запихивания куда-нибудь этого .exe не пойдёт.
Сразу хочу оговориться: я не преследую цели выстроить поистине стойкую защиту. Я лишь хочу заструднить процесс получения пользователем исходников, дабы его цель не оправдывала затраченные средства и время.
Отправившись со своим вопросом в Гугл, я нарыл следующие варианты:
- Обсуфикация кода (например, pyarmor)
- Перевод в байт-код
- Подгрузка закодированного кода с сервера, его декодирование и использование
- cython (не вариант, т.к. основная пачка кода - использование импортируемых модулей)
В конечном счёте, родилась мысль использовать комбинацию этих идей:
1) Использовать подгрузку закодированного кода с сервера.
2) Обсуфицироаать код (pyarmor).
3) Перевести его в байт-код.
4) Собрать .exe (auto-py-to-exe, py2exe).
Собственно, у меня к вам следующие вопросы:
1) Имеет ли смысл такая схема? Какие подводные камни? Возможно, хотите что-то изменить/добавить? Ещё раз: мне будет достаточно даже того, что получение исходников станет хоть сколько-то да затруднительней, нежели я просто соберу из .py файл .exe.
2) Касательно подгрузки закодированного кода: как это осуществить? Я знаю, что можно загрузить .py файл (например, через urllib или requests), раскодировать его и использовать обычный import. Но хотелось бы делать это без сохранения файла на на компьютере пользователя. То есть: подгружаем содержимое .py файла в закодированном виде с сервера, помещаем его в переменную, декодируем и импортируем. И вот здесь возникает вопрос: как импортировать из переменной? Возможно, я не умею пользоваться Гуглом (в таком случае, заранее приношу извинения).
Заранее спасибо за ответ!