Как защитить исходный код Python?

Возможно ли распространять только версию байт-кода (.pyc-файл) скрипта Python вместо исходного файла .py? Мое приложение внедряет интерпретатор Python и вызывает PyImport_Import для загрузки сценария. Как я могу сказать, что он ищет файл .pyc и импортирует его?

5 Solutions collect form web for “Как защитить исходный код Python?”

Я сделал это, создав .py-библиотеку и простую .py-программу, которая использует эту библиотеку. Затем я скомпилировал библиотеку для .pyc и распространял: программу как .py исходный код и библиотеку как скомпилированный .pyc.

Используйте инструмент замораживания , который включен в исходное дерево Python в качестве инструментов / замораживания . Он преобразует байт-код Python в массивы C; с компилятором C вы можете вставлять все свои модули в новую программу, которая затем связана со стандартными модулями Python.

Обратите внимание, что для замораживания требуется компилятор C.

Другие утилиты:

1- PyInstaller

2- Py2Exe

3- Сжатие

4- cx_freeze

Дополнительная информация о effbot.org

Поскольку вы пишете свою основную программу на C ++, вы можете делать все, что хотите, для защиты своих файлов Python. Вы можете зашифровать их для распространения, а затем дешифровать их как раз вовремя, чтобы импортировать их в интерпретатор Python, например.

Поскольку вы используете PyImport_Import, вы можете написать свой собственный __import__ hook для импорта модулей не из файла, а из буфера памяти, поэтому ваше преобразование в .pyc-файл может происходить все в памяти без видимого кода Python на диске вообще.

Это не должно быть проблемой, если вы создаете автономную программу с использованием py2exe, вы получаете только файлы .pyc.

Как правило, вам не нужно указывать python на поиск файлов .pyc, так или иначе. Только если есть более новый .py исходный файл, это используется.

Однако уровень защиты вашего исходного кода может быть не очень высоким.

В интерактивном интерпретаторе это автоматическое – если нет .py, будет использоваться .pyc:

 $ echo 'print "hello"' > test.py $ python -m compileall . $ rm test.py $ python -m test hello $ 

Не могли бы вы просто попробовать, если это будет работать с API?

Отредактировано для добавления: я согласен с Ber в том, что ваша защита кода будет довольно слабой. -O удалит docstrings, если это не изменит поведение вашей программы, что может затруднить восстановление поведения, но то, что вам действительно понадобится для обфускации байткода.

Я не знаю, существует ли готовый инструмент обфускации для python, но это кажется жизнеспособным, если вы хотите / можете потратить время (и не чувствуете себя слишком глупо, делая это, и можете отправлять свой собственный интерпретатор).

  • Ошибка использования сокета при повторном использовании сокетов
  • Как получить доступ к C глобальной структуре переменных с помощью Python и ctype
  • Извлечение SWIG-обернутого экземпляра / указателя C ++ для использования в Cython
  • Почему некоторые собственные векторные знаки из C ++ Armadillo отличаются от Python и R
  • SWIG + setup.py: ImportError: динамический модуль не определяет функцию init (init_foo)
  • Что такое «среда выполнения»?
  • Вектор C ++ для Python 3.3
  • Различия в производительности между Python и C
  • Как предоставить класс C ++ для Python __repr __ () с помощью SWIG
  • Почему код c ++ содержится внутри функций?
  • ctypes: Кастовать строку для работы?
  • Python - лучший язык программирования в мире.