2010-01-13 5 views
8

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

+2

Duplicate: http://stackoverflow.com/questions/261638/how-do-i-protect-python-code –

+3

Разница между этим вопросом и 261638 заключается в том, что это код Python, встроенный в C++, который обеспечивает более интересные возможности влиять на загрузку кода Python. –

ответ

5

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

+0

Это может сработать. Я попробую. –

+0

Работал как шарм! Благодарю. –

+0

Это не будет действительно защищать ваш источник, поскольку байт-код .pyc легко декомпилируется с помощью таких инструментов, как Uncompyle6: https://pypi.python.org/pypi/uncompyle6 –

2

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

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

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

+1

Мое приложение написано на C++, а не на Python. py2exe не вариант. Я имею в виду API Python/C. –

13

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

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

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

1- PyInstaller

2- Py2Exe

3- Squeeze

4- cx_freeze

more info on effbot.org

+0

Сценарии распространяются отдельно от приложения. –

+0

поэтому распространяйте скрипты отдельно ... есть ли какие-либо проблемы? –

+0

Ну ... скрипты тоже не являются его частью. На самом деле некоторые третьи стороны напишут некоторые из них - и им не нужно будет устанавливать компилятор только для их написания. –

2

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

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

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

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

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

+0

Я попробую, когда у меня появится такая возможность. Если я правильно помню, это не сработало. –

+0

Я попробовал. Это не сработало. –

5

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

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

+0

+1 для шифрования –

+0

Слишком сложно для третьих лиц ... –

Смежные вопросы