Рано или поздно все python-разработчики стают перед выбором: отдать заказчику приложение в исходниках или скрыть их. И вот во втором случае у многих (особенно недавно знакомых с этим прелестным языком) начинаются проблемы: поиск по гуглу, как правило, ничего не дает, идей никаких (или все бредовые).
И что же делать в таком случае?
Первой мыслью было отдавать pyc-файлы. Тогда я ещё не вникал в то, что это такое на самом деле. После нескольких часов проведённых в поисках ответов чем это грозит был сделан единственно возможный вывод: вариант не пройдет. Для python < 2.7 «декомпиляторов» полно бесплатных, а 2.7 и выше за сравнительно небольшие деньги обещают выдать в виде исходных кодов. Да ещё и эта тулза, с которой я за считанные мгновения получил свой код один-в-один.
Вариант сборки в бинарник показался достаточно заманчивым. Вот только, как оказалось, все сборщики (ниже я приведу пример cx_Freeze) фактически только и делают что пакуют .pyc в архив, то есть абсолютно не защищают исходные коды.
А потом меня осенило.
Предложим у нас есть проект проект с такой структурой (это всего лиш пример):
Тут сразу хотелось бы отметить два момента:
Делаем несколько простых манипуляций:
После проверки на работоспособность все должно работать точно так же как и прежде.
Вот и все, исходники теперь точно никто не прочитает. Правда отдавать приложение пока рано, заказчик ведь не захочет устанавливать и настраивать питон со всеми использованными вами модулями. Потому собираем все в «пакет»:
После проверки можно отдавать пакет заказчику.
P.S. Надеюсь кому-то это простое how-to сэкономит столько же времени, сколько могло бы сэкономить мне.
И что же делать в таком случае?
Первой мыслью было отдавать pyc-файлы. Тогда я ещё не вникал в то, что это такое на самом деле. После нескольких часов проведённых в поисках ответов чем это грозит был сделан единственно возможный вывод: вариант не пройдет. Для python < 2.7 «декомпиляторов» полно бесплатных, а 2.7 и выше за сравнительно небольшие деньги обещают выдать в виде исходных кодов. Да ещё и эта тулза, с которой я за считанные мгновения получил свой код один-в-один.
Вариант сборки в бинарник показался достаточно заманчивым. Вот только, как оказалось, все сборщики (ниже я приведу пример cx_Freeze) фактически только и делают что пакуют .pyc в архив, то есть абсолютно не защищают исходные коды.
А потом меня осенило.
Предложим у нас есть проект проект с такой структурой (это всего лиш пример):
TestModule/__init__.py
TestModule/Config.py
ui/__init__.py
ui/mainwindow.py
ui/loginwindow.py
main.py
Тут сразу хотелось бы отметить два момента:
- В файле main.py у нас должен быть фактически только вызов главного модуля, если же там что-то большее — желательно оформить это в отдельный модуль
- Файлы __init__.py желательно чтоб были вообще пустые.
Делаем несколько простых манипуляций:
$ sudo apt-get install cython
- Создаем в корне проекта файл compile.py:
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [ Extension("TestModule.Config", ["TestModule/Config.py"]), Extension("ui.mainwindow", ["ui/mainwindow.py"]), Extension("ui.loginwindow", ["ui/loginwindow.py"]), ] setup( name = 'Test App', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules )
- Там же (в корне проекта) выполняем
$ python compile.py build_ext --inplace
- теперь можем удалить все файлы в подкаталогах кроме *.so и __init__.py
После проверки на работоспособность все должно работать точно так же как и прежде.
Вот и все, исходники теперь точно никто не прочитает. Правда отдавать приложение пока рано, заказчик ведь не захочет устанавливать и настраивать питон со всеми использованными вами модулями. Потому собираем все в «пакет»:
$ sudo apt-get install cx-freeze
- В корне проекта создаем файл pack.py:
from cx_Freeze import setup, Executable setup( name = "Test App", version = "0.1", description = "test", executables = [Executable("main.py")])
$ python pack.py build
- Копируем «свои» папки из папки проекта в build/exe.linux-x86_64-2.7
- Пробуем запустить полученный бинарник и, если надо, копируем недостающие библиотеки (в моем случае это был PyQt)
После проверки можно отдавать пакет заказчику.
P.S. Надеюсь кому-то это простое how-to сэкономит столько же времени, сколько могло бы сэкономить мне.